テニススコアアプリTennisCoreをWatchOS2に対応させる作業をしたのですが、予想以上に苦戦しました。
この方法が全てのケースで当てはまるとは限りませんが、他にも苦労している方がいるかもしれないと思い、私のプロジェクトでうまくいった方法をシェアします。
Step 1 : アップルのドキュメントをさらっと読む
watchOS 2 Transition Guide(英語)
をさらっと読みましょう。
個人的には↓ここがポイント
You can deliver your Watch app for both watchOS 1 and watchOS 2 in the same iOS app bundle, but doing so means maintaining separate targets and executables for each. Because it runs on Apple Watch, a Watch app for watchOS 2 must be completely recompiled into a separate executable. And because of the architectural differences between the platforms, sharing code may be more effort and add more complexity than having two separate apps.
watchOS1とwatchOS2はアーキテクチャーが違いすぎるので、コードを共通にして対応するのはオススメしないよ。別々のexecutable (ターゲット)を作って対応してね、と。笑
Step 2: 対応範囲を決める
上記を踏まえてwatchOS1とwatchOS2両方に対応させるのか、あるいはwatchOS2のみ対応でよいのかを決めます。
・2つのコードベースをメンテするのがイヤ(工数的にも精神的にも)
・Apple Watchをこの時期に持っているユーザーは人柱精神を持っている人が多いだろうから、早期にiOS9 & watchOS2へのアップデートをするのではという希望的観測
という2点をもって、TennisCoreの次のアップデートでは、watchOS2のみに対応することにしました。
Step 3: プロジェクトの対応作業開始
作業をするにあたって、このstack over flowのtipsがとても役に立ちました。
全体の作業フローの流れは
1. Xcode7のβ最新版をダウンロード(9月2日時点。Xcode 7のβが取れていれば、そちらを使う)
2. 現状のWatchOS1のファイルをどこかにコピーする(Finderで操作)
3. Xcode上でWatchOS1のターゲットとファイルを削除(Xcode上で)
4. WatchOS2のターゲットを作成(XcodeでFile > New > Target > watchOS > Application > WatchKitApp)
5. この新しくつくったターゲットに、WatchOS1のファイルをコピーする(FinderからXcodeにドラッグ)
6. Buildしてみる
Step 4: プロジェクト内容の修正
私の場合は上記ではすぐにbuildが通りませんでした。
おもに、watchOS2で消滅したメソッドに起因するものと、cocoapods関連でエラーが発生し、下記のような修正しました。
pod関連ファイルが無いよと言われる。
↓こんなエラーメッセージ
diff: /../Podfile.lock: No such file or directory
diff: Manifest.lock: No such file or directory error:
The sandbox is not in sync with the Podfile.lock. Run ‘pod install’ or update your CocoaPods installation.`
[対応方法]
プロジェクトの「Build Settings」→「User-Define」に「PODS_ROOT」がある確認し、なければ名前が「PODS_ROOT」、値が「${SRCROOT}/Pods」をいれる。
http://www.ateliee.com/archives/2364 を参考にしました。
podfileでちゃんと書いてて入れてるはずなのに、library not foundと言われる
↓こんなエラーメッセージ
Target ‘Pods-MyWatchExtension’ of project ‘Pods’ was rejected as an implicit dependency for ‘Pods_MyWatchExtension.framework’ because it doesn’t contain platform ‘watchsimulator’ in its SUPPORTED_PLATFORMS ‘iphonesimulator, iphoneos’
[対応方法]
Watchのextensionで対応プラットフォームを記述しましょう。
target 'My App' do
platform :ios, '9.0'
shared_pods
end
target 'My App Watch Extension' do
platform :watchos, '2.0'
shared_pods
end
https://medium.com/@JTEhlert/using-cocoapods-with-watchos-2-723b92eae04f を参考にしました。
ParseTwitterUtilsが無いよと言われる
TennisCoreではParseのTwitterログインを使っていて、いままでは問題なく使えていたのに、なぜかParseTwitterUtilが無いよと言われるようになりました。
[対応方法]
pod fileに下記記述を追加
pod 'ParseTwitterUtils'
openParentApplicationを呼び出しているところでエラー
openParentApplicationメソッドはwatchOS2では消滅し、WatchConnectivityが誕生したので、openParentApplication部分はコメントアウト。
実機転送してみたら、入れてるライブラリがbitcode対応じゃないよ、と言われる
bitcodeの説明はこちらをご参照ください。
アップルからは「iOSアプリはbitcode対応はoptionalだけど、watchアプリは必須」という指針が出ています。(情報元)
僕がcocoapodsなどで導入している3rd partyライブラリではまだ半分くらいがbitcodeに対応していませんでした。なので、アプリ全体をbitcodeに対応させることができる人は結構少ないのではと思います。
[対応方法]
iOSアプリはbitcode非対応、watchアプリは対応とする。
やりかたは、プロジェクトのbuild settingのEnable BitcodeをYesにした上で、Watchのapp targetとextension targetをNoにしてください。
プロジェクトのbuild settingでもiOSとwatchのbitcode settingを別々に設定できるようにも見えるのですが、この2つの設定は連動してるので、別々に設定することはできません。targetごとに指定するのがキーです。
もちろん、iOSアプリで導入しているライブラリが全てbitcodeに対応していれば、プロジェクト全体をbitcode対応にしてOKです。そのほうが後でいろいろと嬉しい事が多かと。
完了
これで、やっとBuildが通るようになりました。
あとはwatchOS2で生まれた新機能(WatchConnectivityとか、脈拍とか、バイブとか)の実装をすればいい感じでwatchOS2アプリが完成するのではないかと思います。
このドキュメントがApple Watchのキラーアプリ誕生に繋がることを願ってます!