AppleWatchアプリを作っている。
単純な構成のアプリであればXcodeがうまくやってくれるのだが、
少し複雑な構成になってくると手動でやる必要があって色々ややこしい。
のでまとめる。
今回やりたいこと
ひとつのXcodeプロジェクトを次のような構成にしたい。
- アプリを2つ含む。
- 各アプリはWatchアプリを持つ。
ウォッチアプリを作成するためには
TARGETとしてWatchAppとWatchExtensionが必要なので、
結果としてTARGETは次の6つになる。
TARGETを複製等して6つ用意したら、各TARGETのBundleIdentifierを注意深く設定。
これで動くと思ったら大間違い笑
ここからが本番
1. 各Appが正しいWatchを参照してるか確認
- 各App > Build Phases > Target Dependencies
- 各App > Build Phases > Embed Watch Content
2. 各Watchが正しいExtensionを参照してるか確認
3. 各Watchが正しいAppを参照してるか確認
- 各Watch > Info > WatchOS Target Properties > WKCompanionAppBundleIdentifier
4. 最後に各WatchExtensionのプロパティを確認
- 各Extension > Info > WatchOS Target Properties > NSExtension > NSExtensionAttributes > WKAppBundleIdentifier
これでビルドは通った。
実行すると・・・ランタイムでInterfaceControllerのインスタンス化に失敗
[SPRemoteInterface createViewController:className:properties:contextID:info:gestureDescriptions:clientIdentifier:]:2910: Critical failure. Simulating crash: Condition failed:"NO". Couldn't instantiate class _TtC15watchExtensionA19InterfaceController
目を皿のようにして設定を探したら・・・あった。
- Watchターゲット > BuildSetting > Default Module
このプロパティはXcodeが自動設定してくれないので手入力でExtensionを指定してあげよう。
しかしdocomoは金払いが悪い。auとsoftbankを見習うべきと思う。