Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
So you want to make an Apple Watch app?
Search
Neil Kimmett
April 09, 2015
Technology
190
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
So you want to make an Apple Watch app?
Neil Kimmett
April 09, 2015
More Decks by Neil Kimmett
See All by Neil Kimmett
Scaling your app's release process
neilkimmett
0
300
React Native in a native world
neilkimmett
0
280
React Native on tvOS
neilkimmett
0
2.2k
Contributing to Swift
neilkimmett
0
86
Contributing to Swift
neilkimmett
0
71
A Swift introduction
neilkimmett
0
180
A Swift Introduction To Swift
neilkimmett
0
130
Writing Swift
neilkimmett
0
380
Practical WatchKit
neilkimmett
0
350
Other Decks in Technology
See All in Technology
生成AIと進める探索的データ分析(2026.10.03 第122回Tokyo.R勉強会)
tatamiya
2
1.5k
SREでアラート疲れを 解決しよう!
kairim0
1
220
味覇で作るパスタが美味い - 20261001_yabaubuki.dev
livesense
PRO
0
120
「事実」を「計測」して、「解釈」する 〜AWS Lambdaのメモリ最適解の見つけ方〜
maimyyym
0
130
USB PDを使ってスマホを労わりたい
raspython3
0
130
生成AIで高い生産性を求められて、 悩み、乗り越えた話
mot_techtalk
2
150
Execution in the Kingdom of Agents: Reflections on Abstraction and Complexity
bcantrill
0
900
AIに攻撃される前に、AIに攻撃させる
tsuchikazu
0
170
FOSS4Gを活用した自治体業務DXの試み
470715
0
140
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.2k
AI駆動開発、viviONの1年 ── うまくいったこと・いかなかったこと
vivion
0
280
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
1.9k
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
Code Review Best Practice
trishagee
74
20k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
270
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
How to Ace a Technical Interview
jacobian
280
24k
Navigating Weather and Climate Data
rabernat
0
550
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
870
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
300
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Designing Experiences People Love
moore
143
24k
Believing is Seeing
oripsolob
1
240
Darren the Foodie - Storyboard
khoart
PRO
4
4k
Transcript
SO YOU WANT TO MAKE AN APPLE WATCH APP? BY
NEIL KIMMETT
None
None
WHY?
“Apps on Apple Watch are designed for quick, lightweight interactions…”
— Apple Watch Design Guidelines
“If you measure interactions with your iOS app in minutes,
you can expect interactions with your WatchKit app to be measured in seconds.” — Apple Watch Design Guidelines
“If you measure interactions with your iOS app in minutes,
you can expect interactions with your WatchKit app to be measured in seconds.” — Apple Watch Design Guidelines
None
WHAT YOU NEED, WHEN YOU NEED IT.
“For all of the changes that have been wrought by
technology, a huge amount of our daily existence really hasn’t changed in a very long time.” — Ben Thompson
HOW?
None
None
None
None
WKInterfaceButton
class WKInterfaceButton : WKInterfaceObject { func setTitle(title: String?) func setAttributedTitle(attributedTitle:
NSAttributedString?) func setBackgroundColor(color: UIColor?) func setBackgroundImage(image: UIImage?) func setBackgroundImageData(imageData: NSData?) func setBackgroundImageNamed(imageName: String?) func setEnabled(enabled: Bool) }
enum UIButtonType : Int { case Custom case System case
DetailDisclosure case InfoLight case InfoDark case ContactAdd } class UIButton : UIControl, NSCoding { class func buttonWithType(buttonType: UIButtonType) -> AnyObject var contentEdgeInsets: UIEdgeInsets var titleEdgeInsets: UIEdgeInsets var reversesTitleShadowWhenHighlighted: Bool var imageEdgeInsets: UIEdgeInsets var adjustsImageWhenHighlighted: Bool var adjustsImageWhenDisabled: Bool var showsTouchWhenHighlighted: Bool var tintColor: UIColor? var buttonType: UIButtonType { get } func setTitle(title: String?, forState state: UIControlState) func setTitleColor(color: UIColor?, forState state: UIControlState) func setTitleShadowColor(color: UIColor?, forState state: UIControlState) func setImage(image: UIImage?, forState state: UIControlState) func setBackgroundImage(image: UIImage?, forState state: UIControlState) func setAttributedTitle(title: NSAttributedString!, forState state: UIControlState) func titleForState(state: UIControlState) -> String? func titleColorForState(state: UIControlState) -> UIColor? func titleShadowColorForState(state: UIControlState) -> UIColor? func imageForState(state: UIControlState) -> UIImage? func backgroundImageForState(state: UIControlState) -> UIImage? func attributedTitleForState(state: UIControlState) -> NSAttributedString? var currentTitle: String? { get } var currentTitleColor: UIColor! { get } var currentTitleShadowColor: UIColor? { get } var currentImage: UIImage? { get } var currentBackgroundImage: UIImage? { get } var currentAttributedTitle: NSAttributedString? { get } var titleLabel: UILabel? { get } var imageView: UIImageView? { get } func backgroundRectForBounds(bounds: CGRect) -> CGRect func contentRectForBounds(bounds: CGRect) -> CGRect func titleRectForContentRect(contentRect: CGRect) -> CGRect func imageRectForContentRect(contentRect: CGRect) -> CGRect }
class WKInterfaceButton : WKInterfaceObject { func setTitle(title: String?) func setAttributedTitle(attributedTitle:
NSAttributedString?) func setBackgroundColor(color: UIColor?) func setBackgroundImage(image: UIImage?) func setBackgroundImageData(imageData: NSData?) func setBackgroundImageNamed(imageName: String?) func setEnabled(enabled: Bool) }
button.setText("I'm a button")
LIVE DEMO !
None
None
None
None
SHARED APP GROUP
NSUSERDEFAULTS
NSUSERDEFAULTS let defaults = NSUserDefaults.standardUserDefaults() defaults.setInteger(42, forKey: "IMPORTANT_NUMBER") defaults.integerForKey("IMPORTANT_NUMBER") //
42
NSUSERDEFAULTS let group = "group.me.kimmett.pushthebutton" let defaults = NSUserDefaults(suiteName: group)
defaults.setInteger(42, forKey: "IMPORTANT_NUMBER") defaults.integerForKey("IMPORTANT_NUMBER") // 42
NSFILEMANAGER
let group = "group.me.kimmett.pushthebutton" let manager = NSFileManager.defaultManager() let directory
= manager.containerURLForSecurityApplicationGroupIdentifier(group)! let fileURL = directory.URLByAppendingPathComponent("stuff.txt") let fileContents = "OMG super secret spy text" fileContents.writeToFile(fileURL.path!, atomically: true, encoding: NSUTF8StringEncoding, error: nil)
MORE LIVE DEMO
REAL TIME SYNC ▸ MMWormhole https://github.com/mutualmobile/MMWormhole ▸ WFNotificationCenter https://github.com/DeskConnect/WFNotificationCenter
TIPS
REDUCE "TAP DISTANCE"
REDUCE PADDING
REDUCE PADDING
REDUCE PADDING
REDUCE PADDING
BLACK IS THE NEW WHITE
BLACK IS THE NEW WHITE
BLACK IS THE NEW WHITE
!
!
None
REFERENCES ▸ Apple Watch Human Interface Guidelines https://developer.apple.com/library/prerelease/ios/ documentation/UserExperience/Conceptual/ WatchHumanInterfaceGuidelines/
▸ Citymapper on Apple Watch https://medium.com/ios-os-x-development/citymapper-on-apple- watch-843c3e757f58
REFERENCES ▸ “How Apple Will Make The Wearable Market” by
Ben Thompson http://stratechery.com/2015/apple-make-wearable-market/ ▸ “Tap Distance” by David Smith http://david-smith.org/blog/2015/02/03/ailw-tap-distance/
Questions?