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

iPhone

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を自動で選択するよ。もしなければ作ってやるよ」というチェックです。

Signing & Capabilities

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

Automatically manage signing設定

あと、Build Confingurationに応じてどの署名にするか選択もできます。ReleaseForRunninngであればDevelopment向けのProvisioning Profileにしたり、ReleaseであればDistribution向けのProvisioning Profileに設定したりできます。

Build Settings設定

Signing & Capabilitiesで設定したProvisioning ProfileとBuild Settingsで設定する署名方法が不一致の場合、Signing & Capabilitiesでエラーが表示されます。

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が登録されていることが確認できます。

Devices and Simulators
Show Provisioning Profiles
Provisioning Profiles

通常、アプリをRunさせると自動で追加されるのですが、手動でもProvisioning Profileをインストールしたり削除したりできます。

ただし、Distribution向けのProvisioning Profileをインストールしようとすると、以下のようにエラーとなってしまいます。

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

コメント

  1. […] 【iOS】 Provisioning Profile への理解を深めるProvisioning Profile を理解していない… […]

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