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
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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
290
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
170
A Swift Introduction To Swift
neilkimmett
0
120
Writing Swift
neilkimmett
0
370
Practical WatchKit
neilkimmett
0
350
Other Decks in Technology
See All in Technology
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
360
【視聴者参加型!】AWSセキュリティアンチパターンクイズ
syoshie
1
480
深夜のクラウド懺悔室 1:29:300 or 1:0:0
kazzpapa3
1
210
GoにおけるFFIのこれまでとこれから
goccy
4
1.4k
作り直せるコードは迅速に 作り直せないDBは慎重に - AI時代のプロダクトエンジニアが「判断の不可逆性」で開発速度を変える話
kinosuke01
0
280
Bet AI Day 2026丨AIを「使う」から、AIが「働く」へ ― LayerXが進める「組織AI」の社会実装
layerx
PRO
3
2.8k
全員がプロダクトへ向き合う組織を持続成長させるために——組織づくりのフライホイールと4象限 / The Flywheel Model and Four Quadrants for Organizational Design
hiro_torii
4
930
WAF 運用改善の承認サイクル/SRE_BizReach_MIXI_1
visional_engineering_and_design
2
390
Tab5をRubyで動くパソコンにする
kishima
2
280
「図書館」という名前のままでいいのか -Code4Lib JAPANカンファレンス2026 アンカンファレンス報告- / Code4Lib JAPAN Conference 2026: Unconference Report
ykiyota
0
130
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
3
450
生成AIのテナント制御とシャドーMCP対策 | AIを"止めずに"、情報を守る
yukun
0
140
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The Cult of Friendly URLs
andyhume
79
7k
Raft: Consensus for Rubyists
vanstee
141
7.7k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
270
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
230
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
780
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
Agile that works and the tools we love
rasmusluckow
331
22k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
The agentic SEO stack - context over prompts
schlessera
0
910
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?