Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

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

sassymanyuichi
テニススコアアプリとか作ってます。 https://itunes.apple.com/jp/app/tennis-center-count-score/id965807970?ls=1&mt=8
http://www.yuichi.nu/blog/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away