この投稿は、モバイルファクトリー 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の話が来ると予想しています。