【WatchOS】実機テストでのエラーやAppStoreへの申請でのエラーと対処法【Xcode】

AppleWatchの実機テストやWatchOSを含んだアプリをAppStoreへ申請するときにこのようなエラーが出る場合があります。

Embedded binary is not signed with the same certificate as the parent app. Verify the embedded binary target’s code sign settings match the parent app’s.

このエラーは主にTarget > General > Bundle IdentifierとProvisioning Profile(プロビジョニング プロファイル)のIdentifierが一致していない時に起きるエラーです。

以下、このエラーに対する対処法です。

3つのBundle IdentifierとVersionとBuild

AppleWatchでの実機テストの場合、iOSのターゲット、watchOSのターゲット、watch Extensionのターゲットの3つのBundle Identifier、Version、Buildに気をつける必要があります。

Bundle IdentifierをiOSを基準にwatch、watchExtensionも変更

Target > General > Bundle Identifierを変更しましょう。3つのTarget全てに変更が必要です。

(例)
iOSのBundleIdentifier:com.○○○○.TestApp
watchOSのBundleIdentifier:com.○○○○.TestApp.watchkitapp
watchExtensionのBundleIdentifier:com.○○○○.TestApp.watchkitapp.watchkitextension

watchkitappやwatchkitapp.watchkitextensionは必須です。決して消さないようにしましょう。

Version、Buildも揃える

上記と同じようにTarget > General > Version、Target > General > Buildも変更しましょう。上記と違いVersionとBuildは3つのTarget全てを一致させます。

(例)
iOSのVersion:1.0   Build:1
watchOSのVersion:1.0   Build:1
watchExtensionのVersion:1.0   Build:1

これでも失敗する場合は以下について気をつけましょう。

WKCompanionAppBundleIdentifier、WKAppBundleIdentifierに気をつける

3つのターゲットのBundle Identifierを揃えても以下のよなエラーが出る場合があります。

The value of WKCompanionAppBundleIdentifier in your WatchKit app’s Info.plist “com.○○○○.TestApp” does not match the bundle identifier of your companion app “com.○○○○.TestApp”.

WatchKit App doesn’t contain any WatchKit Extensions whose WKAppBundleIdentifier matches “com.○○○○.TestApp.watchkitapp”. Verify that the value of WKAppBundleIdentifier in your WatchKit Extension’s Info.plist matches the value of CFBundleIdentifier in your WatchKit App’s Info.plist.

この場合はプロジェクトのWatchのソースフォルダにあるInfo.plistとWatchExtensionのソースフォルダにあるInfo.plistを修正する必要があります。

WKCompanionAppBundleIdentifierをiOSターゲットのBundleIdentifierにする

WatchのソースフォルダにあるInfo.plistを開きWKCompanionAppBundleIdentifierという項目をiOSターゲットのBundleIdentifierと同じものをセットしましょう。

WKAppBundleIdentifierをwatchOSターゲットのBundleIdentifierにする

WatchExtensionのソースフォルダにあるInfo.plistを開き
NSExtension > NSExtensionAttributes > WKAppBundleIdentifierという項目をwatchOSターゲットのBundleIdentifierと同じものをセットしましょう。

以上で、Xcode上での設定は終わりです。

まとめると

(例)
iOSのBundleIdentifier:com.○○○○.TestApp
watchOSのBundleIdentifier:com.○○○○.TestApp.watchkitapp
watchExtensionのBundleIdentifier:com.○○○○.TestApp.watchkitapp.watchkitextension

watchOSのInfo.plist:WKCompanionAppBundleIdentifier > com.○○○○.TestApp
watchExtensionのInfo.plist:WKAppBundleIdentifier >com.○○○○.TestApp.watchkitapp

iOSのVersion:1.0   Build:1
watchOSのVersion:1.0   Build:1
watchExtensionのVersion:1.0   Build:1

上記のように修正しましょう!

あとは最後にプロビジョニングを上記でセットしたBundleIdentifierで作り直してセットするだけです。watchOSの実機テストやAppStoreへのアップロードはこのあたりがわかりづらいですが、わかってしまえば簡単ですね!