Provisioning Profileを理解せずに、Xcodeでハマりまくっていました。とにかく適当に理解せず進めていたので、アプリがインストールできなかったり、実行できなかったり、デバイスにProvisioning Profileがインストールできなかったり、とにかく何をやってもうまくいかず、Provisioning Profileを何度も何度も生成していました。
今回は改めて、Provisioning Profileを理解すると共に、間違った使い方をしたらどういうことになるかのトラブルシューティングも含めてまとめておきます。
Provisioning Profileを理解する!
Provisioning Profileとは
Provisioning Profileはアプリに対して開発者が署名するためのデータです。Provisioning Profileには以下の情報が詰まっています。
- アプリのBundle ID(com.app.・・・みたいなアプリを特定する情報)
- 自分が持っていて開発に使っているiPhoneやiPadのデバイスの情報
- 自分のMacで生成した証明書
要はProvisioning Profileで署名したアプリは「アプリのデータは正しいですよ」「アプリの用途はこれですよ」「正しい開発者のアプリですよ」が署名により証明されることになります。これは開発者のPCに入った秘密鍵で署名するので、もちろん開発者しか付与できない署名になりますので、開発者お済付きのアプリデータになります。

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

Development用途
開発のためのアプリであることを証明する場合はこちらを選択します。Developmentを選択することで、Xcodeを用いたアプリのインストール、デバッグなど開発作業が許可するためのProvisioning Profileが生成されます。このProvisioning ProfileではアプリのStoreへのリリースはできません。
Distribution用途
配信するためのアプリであることを証明する場合はこちらを選択します。配信方法も選んで選択します。このProvisioning Profileで署名したアプリは開発では使用することができません。
配信方法が選択できる理由の例としては、社内評価のための評価チームへAd Hocで提供したものが間違ってリリースされては困ったり、App Storeにリリース予定のものがMac App Storeに間違ってリリースされることを防ぐことなどがあるかと思います。
Xcodeに設定する時の注意点
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の方で設定を変えてやる必要があります。

これで先ほどのエラーは消えて、ビルドできるようになります。
間違った使い方事例
Distributionの署名でデバッグしようとする
Provisioning Profileを生成する際にDistributionを指定して、Build SettingsもDistributionを指定したにも関わらず、XcodeでRunしようとすると署名が不正となりエラーが発生します。

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)
デバッグをする際は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がもう少し楽に扱えるのではないかと思います。
コメント