Edited at

WatchOS1プロジェクトをWatchOS2対応させる

More than 3 years have passed since last update.

テニススコアアプリ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のキラーアプリ誕生に繋がることを願ってます!