LoginSignup
14

More than 5 years have passed since last update.

iPhoneにインストールされているProvisioning Profileが多すぎるとAdHocでビルドしたバイナリの初回起動に時間がかかる

Last updated at Posted at 2015-12-05

この投稿は、モバイルファクトリー Advent Calendar 2015の5日目のものです。

症状

このような症状に悩まされていました。この時の端末はiPhone4sで、iOS9でした。

  • USBで繋いで端末にアプリを入れた場合は普通に起動する
  • AdHocでビルドしたアプリをDeployGateなりFabricのBetaなりでインストールした場合、20秒で強制的にクラッシュする1
  • 2回クラッシュした後、3回目はすんなり起動する
  • 1度起動できると、アプリを終了せせて再度起動するときもすんなり起動する
  • 端末を再起動する、もしくはアプリを削除してインストールし直した後は3回目でないと起動しない

調査

端末のログを確認したところ、このような出力が山のように出ていました。

securityd[83] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
securityd[83] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
amfid[199] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]

ググったところこのAppleのフォーラムが見つかり、この質問主さんも似たような症状のようでした。

結果的に、上記のエラーは直接的な問題ではないようで、端末にインストールされているProvisioning Profileが異常に多いことが原因でした。Xcodeで確認2したところ、想像以上に多くのProvisioning Profileがインストールされていました。この端末では200個以上は入っていました。同じアプリについてのProvisioning Profileでも、有効期限違いでいくつも入っていたり、社内共有の端末だったため多量のアプリのものが入っていたりで、肥大化してしまっていたようです。

問題となったアプリのProvisioning Profileの名前がアルファベット順で比較的後ろの方に位置していたという状況からの予想ですが、初回起動時はアプリを起動する段階でProvisioning Profileを1つずつ線形探索で探索しつつ有効なものがあるのか確認しているような気がします。2回目以降の起動速度が問題ないのは、初回にて有効なProvisioning Profileをどこかで記憶しているからだと予想しています。

解決策

不要なProvisioning Profileを削除する。

予想起動時間47秒(20秒クラッシュx2 + 3回目の起動時間)だった端末において、今回問題となったアプリ以外全てのProvisioning Profileを削除したところ、7秒で起動するようになりました。

終わりに

明日は、@karupaneruraさんによる「MySQLかPerlかSwiftかGoのはなし」です。個人的にはGoの話が来ると予想しています。

参考


  1. iOSの仕様で、アプリの起動に20秒以上の時間がかかると強制終了させられます。 

  2. ちなみに、端末にインストールされているProvisioning Profileの一覧はXcodeのDevicesにて確認することができるのですが、そのインタフェースが非常にわかりにくいです。Devicesを開き、端末を右クリックすると表示することができます。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14