ObjecTips

Swift & Objective-C で iOS とか macOS とか

WatchKit Development Tips まとめ

Apple Watch の発売に伴って WatchKit Development Tips が公開されてた
2015-04-24 時点のドキュメントまとめ(網羅ではなく適宜省略)

WatchKit Development Tips and Best Practices - Apple Developer

General Guidance

Animate with image sequences.

- (void)startAnimatingWithImagesInRange:(NSRange)imageRange duration:(NSTimeInterval)duration repeatCount:(NSInteger)repeatCount; メソッドの duration にマイナス値を入れるとアニメーションを逆再生できる

Store image sequences on Apple Watch.

イメージシーケンスの読み込み時間を減らすには画像の枚数を最小限に減らす

Use a settings bundle.

iOS と同じように設定を提供する

Go straight to dictation.

テキスト入力コントーラーを使って音声入力をさせるには、プレーンテキスト入力モードを設定して引数のサジェクトを無しにして直接音声入力をさせる (presentTextInputControllerWithSuggestions:allowedInputMode:completion:WKTextInputMode を参照)

State restoration.

interface controller の didDeactivate: メソッドでUIの状態を保存しておいて、root controller の willActivate: メソッドで復元を行う

Performance

Minimize traffic.

アプリと Apple Watch とのトラフィックを最小限にする

Update only what has changed.

プロパティの値のリロード時ではなく変更時にのみ値を更新する
これはテーブルの row を操作している時は特に重要で、テーブル全体をリロードせず変更に対して更新、追加、削除を行うようにする

Load content lazily.

コントローラの最初に見える部分のデータを読み込む
willActivate:dispatch_async を使う事で特定のコンテンツの設定を遅らせる事ができる

Initialize paginated controllers quickly.

ページベースのコントローラの読み込み時間を減らすために、セットアップのほとんどをそれぞれのコントローラの willActivate: で行い、またこのメソッドが呼ばれる初回のみセットアップが行われるようにする
コントローラが作成されると最初のページの willActivate: が呼ばれる前にそれぞれのコントローラの init awakeWithContext: が呼ばれるので、システムは最初のページが表示される前にこれらの init awakeWithContext: が全て完了するのを待つ事になる

Simplify controller scenes.

hidden なオブジェクトは可能な限り減らす
例えば1つのシーンで5パターンのレイアウトのバージョンがあると、コントローラを表示する前にそれらを全て作成する事になる

Improve load times with fewer table rows.

初期表示の row 作成は最適な数にして willActivate: が終わるまで追加の読み込みを遅らせる

Communicating with iPhone

The iPhone app should do most of the work.

WKInterfaceController クラスの openParentApplication:reply: メソッドを使ってiPhoneアプリをバックグランド起動して、WatchKit Extension が欲しいデータを返してもらう
WatchKit のリクエストをハンドリングする UIApplicationDelegate メソッドはすぐに return しなければならないので、例えばもしネットワーク通信のような asynchronous な処理が必要であれば、バックグラウンドタスクを使って reply を返すまでアプリが停止しないようにする

Share data with App Groups.

App Groups と NSUserDefaults でちょっとしたデータを共有する
Core Data store のような他のリソースにアクセスするような場合は shared container でデータを共有する

Use Handoff.

WKInterfaceController で利用可能な Handoff API はグランスやカスタム通知で iPhoneアプリへの deep link を作成するために使う必要がある

Share code with frameworks.

iOSアプリと WatchKit Extension でコードを共有する framework を作る
framework はアクセシブルで冗長性を防ぎ、プロジェクト内の複数のコードで確実に bug fix が作用するようになる