【Xcode】既存のiOSプロジェクトにApple Watchターゲットを追加する方法
この記事からわかること
- Swift UIでApple Watchアプリを開発する方法
- 既存のiOSプロジェクトにwatchOSターゲットを追加するには?
- 発生したエラーの解決方法
- WCSession counterpart app not installedとは?
- This app has the ITSWatchOnlyContainer key set in its Info.plist, which identifies it as a shell app surrounding a Watch-only app; these are not installable.とは?
- watch-only apps cannot be contained in companion apps installed on the companion.とは?
- watchkit 2.0 app's bundle id バンドルID is not prefixed by the parent app's bundle id followed by a '.'; expected prefix バンドルID.とは?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- iOS:17.0
- watchOS:10.0
- Swift:5.9
- macOS:Sonoma 14.1
既存のiOSプロジェクトにApple Watchターゲットを追加する方法
アプリと連携したApple Watchアプリを開発したいけど既にプロジェクトを作成しリリースしている場合は新規でプロジェクトを作成してApple Watchアプリを開発するのではなく既存のプロジェクトにターゲットを追加して開発していきたい状況になりました。
連携させるためのApple Watchターゲットを追加するのに少し苦戦したので方法をまとめておきます。方法がいくつかあるので自分に合った方法で試してみてください。
新規開発やwatchOSアプリの実装方法は以下の記事を参考にしてください。
方法1:既存の中に新規でiOSターゲットとwatchOSターゲットを作成する
最初は既存のアプリの中に新規でiOSターゲットとwatchOSターゲットの2つのターゲットを作成する方法です。この場合は既存のアプリではApple Watchと連携はしないが新規でiOSアプリとwatchOSアプリを開発する際に同プロジェクト内で管理する際の方法です。
ターゲットの種類:Bundle ID
- 既存iOSターゲット:既存Bundle ID
- 新規iOSターゲット(連携):新規Bundle ID
- 新規watchOSターゲット(連携):新規Bundle ID.watchkitapp
既存のプロジェクトを開き、Xcode上部メニュー「File」>「New」>「Target..」をクリックし「watchOS」>「App」をクリックします。
アプリ名(新規Bundle ID)を設定できるので入力し「Watch App with New Companion iOS App」にチェックを入れて進みます。
スキームをアクティブ化するように求められるので「Active」をクリックします。
これでプロジェクト内にiOSターゲットとwatchOSターゲットの2つのターゲットが追加されます。プロジェクトの中身は以下の通りになります。
この場合MyAppWatch Watch App(watchOS側)と連携できるのはMyAppWatch(新規iOS側)のみとなります。MyApp(既存iOS側)と接続処理を試みてもうまく動作しないので注意してください。
方法2:既存iOSと連携するwatchOSターゲットを作成する
こちらは既存のiOSアプリと連携するwatchOSアプリを追加したい場合の方法です。大概の人がこちらかなと思います。方法は簡単ですが流れを見ていきます。
ターゲットの種類:Bundle ID
- 既存iOSターゲット:既存Bundle ID
- 新規watchOSターゲット(連携):既存Bundle ID.watchkitapp
既存のプロジェクトを開き、Xcode上部メニュー「File」>「New」>「Target..」をクリックし「watchOS」>「App」をクリックします。
Watchアプリ名を設定できるので入力し「Watch App for Existing iOS App」にチェックを入れて進みます。
スキームをアクティブ化するように求められるので「Active」をクリックします。
これでプロジェクト内に既存のiOSターゲットと連携する設定がされてwatchOSターゲットが追加されます。プロジェクトの中身は以下の通りになります。
Watch専用ターゲットを連携として設定しなおす方法
こちらは一度Watch専用でターゲットを追加してしまった場合にiOSターゲットと連携させる場合の方法です。「Watch-only App」でアプリを追加した場合と「Watch App with New Companion iOS App」で追加した場合では設定が異なるようで既存のプロジェクトに「Watch-only App」で追加するとビルドが通らなくなります。これから紹介する方法はエラーを回避した方法ですがこの記事の最後に発生したエラーも記載しておきます。
少し流れがややこしいので流れを先に確認します。
- 「Watch-only App」でwatchOSターゲットを追加
- Watch Appターゲットのinfo.plistに「WKCompanionAppBundleIdentifier」キーを追加
- Watch Appターゲットのinfo.plistから「App is only available as a standalone watchOS app」キーを削除
- Watch Appターゲットのinfo.plistに「App can run independently of companion iPhone app」キーを追加
- Watch AppターゲットのBundle IDを「既存Bundle ID.watchkitapp」に変更
- 既存iOSターゲットの「Frameworks,Libraries,and Embedded Content」にWatch Appターゲットを追加
- 不要なターゲットの削除
「Watch-only App」でwatchOSターゲットを追加
既存のプロジェクトを開き、Xcode上部メニュー「File」>「New」>「Target..」をクリックし「watchOS」>「App」をクリックします。
アプリ名を設定できるので既存のアプリ名に倣って入力し「Watch-only App」にチェックを入れて進みます。
スキームをアクティブ化するように求められるので「Active」をクリックします。
ここまで完了するとプロジェクトの中が以下のようになります。よく見るとディレクトリ自体は期待通りですが「Watch App with New Companion iOS App」の時と同じように連携watch用のiOSターゲットとwatchOSターゲットの2つが自動生成されています。(これについては後述します)
Watch Appターゲットのinfo.plistに「WKCompanionAppBundleIdentifier」キーを追加
Watch Appターゲット(今回でいうとMyAppWatch Watch App)のinfo.plistにWKCompanionAppBundleIdentifier
キーを追加して、値には既存のiOSターゲットのBundle IDを渡します。
info.plistへ追加
- キー:WKCompanionAppBundleIdentifier
- 値:既存のiOSターゲットのBundleID(今回でいうとcom.name.MyApp)
Watch Appターゲットのinfo.plistから「App is only available as a standalone watchOS app」キーを削除
続いてWatch Appターゲットのinfo.plistからApp is only available as a standalone watchOS app
キーを削除します。
info.plistから削除
- キー:App is only available as a standalone watchOS app
- 値:YES
Watch Appターゲットのinfo.plistに「App can run independently of companion iPhone app」キーを追加
Watch Appターゲットのinfo.plistにApp can run independently of companion iPhone app
キーを追加して、値にはYES
を渡します。
info.plistへ追加
- キー:App can run independently of companion iPhone app
- 値:YES
Watch AppターゲットのBundle IDを「既存Bundle ID.watchkitapp」に変更
Watch AppターゲットのBundle IDを既存Bundle ID.watchkitapp形式に変更します。
既存iOSターゲットの「Frameworks,Libraries,and Embedded Content」にWatch Appターゲットを追加
既存iOSターゲットの「General」>「Frameworks,Libraries,and Embedded Content」にWatch Appターゲットを追加します。
以下のように追加できていればOKです。
不要なターゲットの削除
ターゲット追加時に自動で生成された連携watch用のiOSターゲットは不要になったので「TARGETS」から右クリックして「Delete」で削除して完了です。
これで既存のiOSターゲットとwatchOSターゲットが連携することができました。ペアリングして接続する処理を実装して正常にビルドから接続まで行けるようになっていることを確認してください。接続するかどうかは「こちら」の方法をお試しください。
WCSession counterpart app not installed
XcodeのログにWCSession counterpart app not installed
と表示された場合はiOSターゲットとwatchOSターゲットがうまく連携できていない可能性があります。
翻訳
WCSessionの対応するアプリがインストールされていない
「Frameworks,Libraries,and Embedded Content」にWatch Appターゲットを追加することで解決いたしました。
This app has the ITSWatchOnlyContainer key set in its Info.plist, which identifies it as a shell app surrounding a Watch-only app; these are not installable.
「Watch-only App」で追加後にそのままビルドしようとすると以下のようなポップアップが表示されThis app has the ITSWatchOnlyContainer key set in its Info.plist, which identifies it as a shell app surrounding a Watch-only app; these are not installable.
と表示されます。
翻訳
このアプリには、Info.plist に ITSWatchOnlyContainer キーが設定されており、これにより、ウォッチ専用アプリを囲むシェル アプリとして識別されます。これらはインストールできません。
これはinfo.plistに適切なキーを設定することで解決することができます。
watch-only apps cannot be contained in companion apps installed on the companion.
watch-only apps cannot be contained in companion apps installed on the companion.
翻訳
WCSessionの対応するアプリがインストールされていない
watchkit 2.0 app's bundle id バンドルID is not prefixed by the parent app's bundle id followed by a '.'; expected prefix バンドルID.
ビルドを試みた際にwatchkit 2.0 app's bundle id バンドルID is not prefixed by the parent app's bundle id followed by a '.'; expected prefixバンドルID.
と表示されることがあります。
翻訳
watchkit 2.0 アプリのバンドル ID XXXXXXXX には、親アプリのバンドル ID の後に「.」が続く接頭辞が付いていません。予期されるプレフィックス XXXXXXXX
これはwatchOS側のバンドルIDの設定を変更することで解決することができました。
参考文献:Watch-only apps cannot be contained in companion apps installed on the companion.
ご覧いただきありがとうございました。