Provisioning Profile を理解していないと、アプリがインストールできなかったり、実行できなかったり、アーカイブ化できなかったり、と、様々な問題に直面してしまいます。
この記事ではProvisioning Profile を最短でしかも深く理解できるように説明していきます。
そして、Provisioning Profileを理解すると共に、間違った使い方をしたらどういうことになるのか?そのトラブルシューティングも含めて説明します。
Provisioning Profileの生成やXcodeへの設定手順についてはこちらを参照してください。
Provisioning Profile とは何か?
Provisioning Profileは作成したアプリに対してアプリ開発者が署名するために必要なデータです。Provisioning Profileには以下の情報が詰まっています。
- アプリのBundle ID(com.app.・・・みたいなアプリを特定する情報)
- 自分が持っていて開発に使っているiPhoneやiPadの実機デバイスの情報
- 自分のMacで生成した証明書
- アプリの用途(開発or配布)
つまり、Provisioning Profileを使って署名したアプリは「このアプリのデータは正しいですよ」「このアプリの用途はこれですよ」「このアプリは開発者が認めたアプリですよ」が証明されることになります。
これは開発者のPCに入った秘密の鍵を使うので、もちろん開発者しか付与できない署名になりますので、一言でいうなら開発者お済付きのアプリデータになります。

もしこのアプリデータを署名にある目的に反した使い方をしよとすると、エラーではじかれることになります。また、データの改ざんも検知できるので、開発者は偽物のアプリが出回ることを防ぐことができます。
Provisioning Profileにアプリの用途を指定する
アプリの用途とは?
Provisioning Profileにはそのアプリの用途を指定することができます。
用途は以下のDeveloper サイトにあるように、Development(開発)用途とDistribution(配布)用途の二種類があります。

Development用途
開発のためのアプリであることを証明する場合はこちらを選択します。Developmentを選択することで、Xcodeを用いたアプリのインストール、デバッグなど開発作業が許可するためのProvisioning Profileが生成されます。
このProvisioning Profileで署名したアプリはストアへリリースできません。
Distribution用途
配信するためのアプリであることを証明する場合はこちらを選択します。配信方法も選んで選択します。
このProvisioning Profileで署名したアプリを開発で使用することはできません。
配信方法が選択できる理由の例としては、社内評価のための評価チームへAd Hocで提供したものが間違ってリリースされては困ったり、App Storeにリリース予定のものがMac App Storeに間違ってリリースされることを防ぐことなどがあるかと思います。
XcodeにProvisioning Profileを設定する時の注意点
Signing & Capabilitiesの設定
Xcodeのプロジェクトを開いてSigning & CapabilitiesのタブからSingingの設定をします。
ここで作成したProvisioning Profileを指定するのですが、Automatically manage signingというのも設定できます。
これは、「デバッグするためのProvisioning Profileを自動で選択するよ。もしなければ作ってやるよ」というチェックです。

開発用途の場合はここにチェックを付けて、Teamを自分のApple IDを選択しておけば、以下のようにDevelopment向けのProvisioning Profileを勝手に作ってよろしくやってくれます。

あと、Build Confingurationに応じてどの署名にするか選択もできます。ReleaseForRunninngであればDevelopment向けのProvisioning Profileにしたり、ReleaseであればDistribution向けのProvisioning Profileに設定したりできます。
Build Settings設定
Signing & Capabilitiesで設定したProvisioning ProfileとBuild Settingsで設定する署名方法が不一致の場合、Signing & Capabilitiesでエラーが表示されます。

Unity-iPhone has conflicting provisioning settings.
Unity-iPhone is automatically signed for development, but a conflicting code signing
identity Apple Distribution has been manually specified.
Set the code signing identity value to "iPhone Developer" in the build settings editor,
or switch to manual signing in the Signing & Capabilities editor.
これはBuild Settingsでの署名設定とここで指定したProvisioning Profileがあっていないことを意味するエラーです。Build Settingsで設定を変えてやる必要があります。

これで先ほどのエラーは消えて、ビルドできるようになります。
Provisioning Profile の用途にあわせてビルド構成毎に設定したProvisioning Profileに合わせてDeveloperかDistributionを設定しておけばエラーは回避できます。
間違った使い方事例
Distributionの署名でデバッグしようとする
Provisioning Profileを生成する際に用途をDistributionを指定して、Build SettingsもDistributionを指定して実行しようとすると、用途が一致しているにも関わらず署名が不正となりエラーが発生します。

Unable to install XXXXX
エラーの詳細ログは以下です。署名検証に失敗したエラーが表示されます。

Unable to install "SorobanFreePlay"
Domain: com.apple.dt.MobileDeviceErrorDomain
Code: -402620395
--
A valid provisioning profile for this executable was not found.
Domain: com.apple.dt.MobileDeviceErrorDomain
Code: -402620395
User Info: {
DVTRadarComponentKey = 487925;
MobileDeviceErrorCode = "(0xE8008015)";
"com.apple.dtdevicekit.stacktrace" = (
0 DTDeviceKitBase 0x000000011c76481a DTDKCreateNSErrorFromAMDErrorCode + 233
1 DTDeviceKitBase 0x000000011c7a5f70 __90-[DTDKMobileDeviceToken installApplicationBundleAtPath:withOptions:andError:withCallback:]_block_invoke + 155
2 DVTFoundation 0x000000010373df35 DVTInvokeWithStrongOwnership + 73
3 DTDeviceKitBase 0x000000011c7a5ca8 -[DTDKMobileDeviceToken installApplicationBundleAtPath:withOptions:andError:withCallback:] + 1654
4 IDEiOSSupportCore 0x000000011c61ce91 __118-[DVTiOSDevice(DVTiPhoneApplicationInstallation) processAppInstallSet:appUninstallSet:installOptions:completionBlock:]
_block_invoke.352 + 4165
5 DVTFoundation 0x00000001038715d4 __DVT_CALLING_CLIENT_BLOCK__ + 7
6 DVTFoundation 0x0000000103873216 __DVTDispatchAsync_block_invoke + 1194
7 libdispatch.dylib 0x00007fff672926c4 _dispatch_call_block_and_release + 12
8 libdispatch.dylib 0x00007fff67293658 _dispatch_client_callout + 8
9 libdispatch.dylib 0x00007fff67298c44 _dispatch_lane_serial_drain + 597
10 libdispatch.dylib 0x00007fff672995d6 _dispatch_lane_invoke + 363
11 libdispatch.dylib 0x00007fff672a2c09 _dispatch_workloop_worker_thread + 596
12 libsystem_pthread.dylib 0x00007fff674eda3d _pthread_wqthread + 290
13 libsystem_pthread.dylib 0x00007fff674ecb77 start_wqthread + 15
);
}
--
System Information
macOS Version 10.15.5 (Build 19F101)
Xcode 11.6 (16141)
Console.appへの出力はこのようにエラーの内容が表示されます。Verification stage failedとなっているのがわかります。
verify code signature of /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.KZeYYb/extracted/FreePlay.app : 0xe8008015
(A valid provisioning profile for this executable was not found.)
installd 0x16d71f000 -[MIInstaller performInstallationWithError:]: Verification stage failed
runningboardd Invalidating assertion 28-47-206 (target:application<com.Hirokuma.App.FreePlay>) from originator 47
SpringBoard termination assertion efficacy for com.Hirokuma.App.FreePlay changed to 0
wifid Too frequent(4.999418 secs) CCA event from driver
installd com.Hirokuma.App.FreePlay:7:7:2:0:Fail (End) : Install (Promote From Placeholder)
原因はDistribution用に生成したProvisioning Profileでデバッグしようとしたことにあります。デバッグする際はDevelopment用に生成したProvisioning Profileで署名するようにしましょう。
デバイスにProvisioning Profileが登録できない
iPhoneにProvisioning Profileを登録することで、アプリをインストールされるiPhoneはそのアプリの署名を検証します。
例えば、DevelopmentのProvisioning Profileで署名したアプリをRunさせた後、XcodeのWindow→Devices and SimulatorsからiPhoneを右クリック→Show Provisioning Profilesを見るとDevelopmentのProvisioning Profileが登録されていることが確認できます。



通常、アプリをRunさせると自動で追加されるのですが、手動でもProvisioning Profileをインストールしたり削除したりできます。
ただし、Distribution向けのProvisioning Profileをインストールしようとすると、以下のようにエラーとなってしまいます。

Failed to install one or more provisioning profiles on the device.
Please ensure the provisioning profile is configured for this device. If not, please try to generate a new profile.
Distribution向けのProvisioning Profileでは開発向けアプリを実機で動かすことはできません。よって、Distribution向けProvisioning Profileをデバイスに登録することもできません。
おわりに
とにかく厄介なProvisioning Profileです。
個人的な感想ですが、どういう時にどういうProvisioning Profileが使えるのか明確になっていないところがあると感じました。明確になっていないと思い込みで進めてつまづくということの連続だったように思います。
例えばAdHocは通常のStoreのリリースとは異なる配布方法で、Development色が強いので、XcodeでRunできてもいいのでは?とか、リリース用の署名をデバイスにインストールして最後に正しいものができているか確認したいので、デバッグは無理でもインストールくらいできそう、とか初心者にはどこまで署名の効果が効いてくるのかが理解しにくいと感じました。
ただ、調べていくうちにわかったのは
- Xcodeで実行するデバッグはDevelopment
- 配布はDistribution
- これらは互いに相互利用できない
です。これさえ理解しておけば、Provisioning Profileがもう少し楽に扱えるのではないかと思います。
コメント
[…] 【iOS】 Provisioning Profile への理解を深めるProvisioning Profile を理解していない… […]