【iOS】Provisioning Profileの理解を深める

iPhone

 Provisioning Profileを理解せずに、Xcodeでハマりまくっていました。とにかく適当に理解せず進めていたので、アプリがインストールできなかったり、実行できなかったり、デバイスにProvisioning Profileがインストールできなかったり、とにかく何をやってもうまくいかず、Provisioning Profileを何度も何度も生成していました。

 今回は改めて、Provisioning Profileを理解すると共に、間違った使い方をしたらどういうことになるかのトラブルシューティングも含めてまとめておきます。

Goal

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がもう少し楽に扱えるのではないかと思います。

コメント

タイトルとURLをコピーしました