[Xcode] ipa ファイルを iPhone 実機にインストール出来ない場合の対処方法
はじめに
本記事では ipa ファイルのインストール時に「The executable was signed with invalid entitlements.」というエラーメッセージが表示された場合の対処方法を紹介します。
問題が発生した環境と操作
以下のように、開発用と配布用の Apple Developer Program のアカウントがあり、ベータ配信を行うために ipa を書き出したところ、iPhone 実機にインストール出来ない問題に遭遇しました。
環境
- Apple Developer Program (開発用) のアカウント
- 開発時は、このアカウントを使用
- Xcode の Preferences の Accounts に Apple ID/パスワードを入力済
- Admin 権限を持っている
- Apple Developer Program (配布用) のアカウント
- ベータ配信時は、このアカウントを使用
- Xcode の Preferences の Accounts に Apple ID/パスワードを入力していない
- 以下のファイルだけ持っている
- アドホックプロビジョニングプロファイル
- distribution 用の証明書、秘密鍵
- Xcode 7.2
操作
具体的に行なった操作は以下のとおりです。
1. *.xcarchive ファイルを作成
Xcode で Product -> Archive を実行しました。
2. *.ipa ファイルを作成
xcodebuild コマンドを使用して、ipa ファイルを作成しました。
配布用のアカウントのアドホックプロビジョニングプロファイルを指定しました。
$ xcodebuild -exportArchive -exportFormat IPA \ -archivePath <*.xcarchive ファイルのパス> \ -exportPath <*.ipa ファイルのパス> \ -exportProvisioningProfile <ProvisioningProfile 名>
3. ipa ファイルを実機にインストール
Xcode の Devices ウィンドウから実機へ ipa ファイルをインストールしようとしたところ、以下のエラーが表示されました。
The executable was signed with invalid entitlements. The entitlements specified in your application’s Code Signing Entitlements file do not match those specified in your provisioning profile. (0xE8008016).
解決方法
以下の作業を行なって問題箇所を探しました。
- .app bundle の Entitlements を確認する
- embedded.mobileprovision の Entitlements を確認する
- 値が違う箇所があれば一致するように修正する
1. app bundle の Entitlements を確認する
*app ファイルを取り出す
- *.ipa ファイルの拡張子を zip に変更する
- *.zip ファイルを解凍する
- Payload フォルダが作成される
- その中に *app ファイルがある
Entitlements を確認
以下のコマンドを使って確認します。
$ codesign -d --entitlements - <.app のパス>
以下のような結果が出力されます。
��qq#<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>application-identifier</key> <string>BUNDLESEEDIDA.jp.example.app</string> <key>aps-environment</key> <string>production</string> <key>com.apple.developer.team-identifier</key> <string>BUNDLESEEDIDB</string> <key>get-task-allow</key> <false/> <key>keychain-access-groups</key> <array> <string>BUNDLESEEDIDA.jp.example.app</string> </array> </dict> </plist>
2. embedded.mobileprovision の Entitlements を確認
- 「1. app bundle の Entitlements を確認する」で取り出した *.app ファイルを Finder で表示し、右クリックして「パッケージの内容を表示」を選択
- *.app ファイルの中身が表示される
- その中に embedded.mobileprovision ファイルがある
- テキストエディタなどで embedded.mobileprovision ファイルを開く
- 20行目あたりに Entitlements キーがあるので値を確認する
... <key>Entitlements</key> <dict> <key>keychain-access-groups</key> <array> <string>BUNDLESEEDIDB.*</string> </array> <key>get-task-allow</key> <false/> <key>application-identifier</key> <string>BUNDLESEEDIDB.jp.example.app</string> <key>com.apple.developer.team-identifier</key> <string>BUNDLESEEDIDB</string> <key>aps-environment</key> <string>production</string> </dict> ...
3. 値が違う箇所があれば一致するように修正する
比較
今回の場合は Entitlements 以下に 5 つのキーがありました。5つの値をそれぞれ比較します。
- keychain-access-groups
- get-task-allow
- application-identifier
- com.apple.developer.team-identifier
- aps-environment
比較してみたところ、以下の 2 つのキーに対応する値で使われている「Bundle seed ID」が一致していませんでした。
- keychain-access-groups
- application-identifier
修正
ここで、Build Settings -> Code Signing Identity の値を確認したところ、全て iOS Developer となっていました。
ipa 作成時のビルドで使用する Build Configuration の Code Signing Identity に特定の証明書 (ipa 作成時に使用したい証明書) を指定してみると、Entitlements が一致しない問題が解消し、出力した ipa ファイルを iPhone 実機にインストールできるようになりました。
まとめ
本記事では ipa ファイルのインストールエラーの対処方法を紹介しました。同様の問題に遭遇している人の参考になれば幸いです。
参考ページ
- Technical Note TN2250 iOS Code Signing Troubleshooting
- Technical Q&A QA1798 Checking Distribution Entitlements
- Technical Note TN2415 Entitlements Troubleshooting
- “The executable was signed with invalid entitlements.” の対処方法
- Entitlements file do not match those specified in your provisioning profile.(0xE8008016)