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

テニススコアアプリ[TennisCore](https://itunes.apple.com/jp/app/tennis-center-count-score/id965807970?ls=1&mt=8)をWatchOS2に対応させる作業をしたのですが、予想以上に苦戦しました。
この方法が全てのケースで当てはまるとは限りませんが、他にも苦労している方がいるかもしれないと思い、私のプロジェクトでうまくいった方法をシェアします。

#Step 1 : アップルのドキュメントをさらっと読む

[watchOS 2 Transition Guide(英語)](https://developer.apple.com/library/prerelease/watchos/documentation/General/Conceptual/AppleWatch2TransitionGuide/index.html#//apple_ref/doc/uid/TP40015234-CH2-SW1)
をさらっと読みましょう。

個人的には↓ここがポイント
>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のみ対応でよいのかを決めます。

・２つのコードベースをメンテするのがイヤ（工数的にも精神的にも）
・Apple Watchをこの時期に持っているユーザーは人柱精神を持っている人が多いだろうから、早期にiOS9 & watchOS2へのアップデートをするのではという希望的観測

という２点をもって、TennisCoreの次のアップデートでは、watchOS2のみに対応することにしました。

#Step 3: プロジェクトの対応作業開始

作業をするにあたって、[このstack over flowのtips](http://stackoverflow.com/questions/31227277/upgrading-existing-watchos-1-project-to-watchos-2)がとても役に立ちました。

全体の作業フローの流れは
1. Xcode7のβ最新版をダウンロード（9月２日時点。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の説明は[こちら](http://cockscomb.hatenablog.com/entry/watchos-2-architecture)をご参照ください。

アップルからは「iOSアプリはbitcode対応はoptionalだけど、watchアプリは必須」という指針が出ています。([情報元](https://developer.apple.com/library/prerelease/watchos/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html))

僕が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を別々に設定できるようにも見えるのですが、この２つの設定は連動してるので、別々に設定することはできません。targetごとに指定するのがキーです。

もちろん、iOSアプリで導入しているライブラリが全てbitcodeに対応していれば、プロジェクト全体をbitcode対応にしてOKです。そのほうが後でいろいろと嬉しい事が多かと。

#完了

これで、やっとBuildが通るようになりました。
あとはwatchOS2で生まれた新機能（WatchConnectivityとか、脈拍とか、バイブとか）の実装をすればいい感じでwatchOS2アプリが完成するのではないかと思います。

このドキュメントがApple Watchのキラーアプリ誕生に繋がることを願ってます！