Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
So you want to make an Apple Watch app?
Search
Neil Kimmett
April 09, 2015
Technology
180
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
270
React Native on tvOS
neilkimmett
0
2.2k
Contributing to Swift
neilkimmett
0
86
Contributing to Swift
neilkimmett
0
70
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
DDDのエッセンスを取り入れたAIでの開発
ak2ie
0
200
自宅NWにISR4331を導入してみた話
okaits
0
120
Genie Codeハンズオン応用編
taka_aki
0
140
作って理解するCoding Agent 〜フレームワークに頼らないピュア Python での実装〜
takapy
3
850
巨大気象データと戦う ― サロゲートモデル学習を高速化する圧縮技術
gpuunite_official
0
200
カーネルまで探検して理解するふたつの自動計装
sumiyae
0
110
Kiro入門|仕様駆動開発で変わるAI時代の開発スタイル
cmkudo
0
300
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
4
26k
医療の現場を変革に挑戦した半年間の軌跡 - PythonとAIで現場を変える / From Code to Care
soudai
PRO
0
490
案件に一番詳しいAIを Amazon Bedrock AgentCore で作る ― 知見が知見を生むチームへ / Compounding Knowledge with AgentCore
yusukeshimizu
1
170
AI時代のアウトプット――変わったこと、変わらないこと / Devsumi 2026 Kansai #devsumi
jnchito
0
440
国家プロジェクトを支える「さくらONE」 大規模LLM開発におけるGPU障害を乗り越えるクラスター運用戦略
gpuunite_official
0
210
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
970
Chasing Engaging Ingredients in Design
codingconduct
0
280
First, design no harm
axbom
PRO
2
1.3k
For a Future-Friendly Web
brad_frost
183
10k
HDC tutorial
michielstock
2
810
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
480
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
730
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.4k
Designing for Timeless Needs
cassininazir
1
450
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.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?