この投稿はWatchKit Advent Calendar 2014の7日目の記事です。

前提知識

Watch Appのアーキテクチャ

Apple Watch側にStoryboardやリソースファイルを置いて、iPhoneのWatchKit Extension側で処理を行います。
UIの更新などApple WatchとiPhone間の通信はWatchKitが行います。

app_communication_2x
(via WatchKit Programming Guide: Watch App Architecture)

Watch Appのライフサイクル

ユーザがApple WatchであなたのWatch Appを起動すると、自動的にiPhone側のWatchKit Extensionを起動します。
ユーザの操作が終わると、iOSはWatchKit Extensionの実行を中断します。
つまり、WatchKit Extensionは、ユーザがApple WatchであなたのWatch Appを操作中の時のみ実行できます。

launch_cycle_2x
(via WatchKit Programming Guide: Watch App Architecture)

WKInterfaceControllerでのライフサイクルハンドリング

下記図のとおりです。

watch_app_lifecycle_simple_2x
(via WatchKit Programming Guide: Watch App Architecture)

initWithContext:

WKInterfaceControllerが作成されて、最初に呼ばれるメソッドです。
データのロードや、ラベル、画像、テーブルなどのオブジェクトを更新するために使用します。
contextでHandoffや他の画面から値を受け取ることができます。

willActivate

ユーザにUIが表示されたタイミングで呼ばれるメソッドです。
UIの更新や、UIがアクティブなときだけ発生するようなタスクの実行に使用します。
例えば、タイマーのセットや、アニメーションの開始、ビデオのストリーミング開始(ぇ、そんなのできたっけ?)などです。

didDeactivate

ユーザがApple Watchであなたのアプリを操作することをやめると呼ばれるメソッドです。
クリーンアップの処理を行います。
例えば、タイマーの停止や、アニメーションの停止、ビデオのストリーミング停止などです。
次にwillActivateが呼ばれるまでの間は、UIに値をセットしても無視されます。

複数画面ある場合は?

実験してみました。
First、Second、Thirdという名前のWKInterfaceControllerを作成し、
First->Second->Third->Second->Firstの順に画面遷移し、ライフサイクルハンドリングするメソッドでログを吐いてみました。

以下ログ。

FirstのinitWithContext
FirstのwillActive
SecondをPush
SecondのinitWithContext
SecondのwillActivate
FirstのdidDeactivate
ThirdをPush
ThirdのinitWithContext
ThirdのwillActivate
SecondのdidDeactivate
ThirdをPop
SecondのwillActivate
ThirdのdidDeactivate
SecondをPop
FirstのwillActivate
SecondのdidDeactivate

次の画面がwillActivateになったら、自身がdidDeactivateになるようです。

宣伝

Swiftでカスタムキーボードアプリ作りました。買ってね!
特殊文字キーボード

Pocket