きっかけ
iOSアプリ公開の壁となっているプロビジョニング周りですが、ハマりまくったので覚えている内に図にしました。
難しくしてる理由
難しくしているのは、この辺が理由ではないかと思います。
- iOS Developerサイトでの画面・操作手順がしょっちゅう変わる
- Xcodeも、バージョンによって画面・操作手順が変わる
ということで、書籍やWebでのノウハウがすぐに古くなってしまいます。ググるといろんな情報が出てきてしまい、かえって混乱します。
また、開発時のiOSデバイスはXcode側である程度自動的にやってくれるのですが、それがかえって分からなくしているような気がします。
概念図
ということで、結局、概念を理解してしまうのがいいのではないかと思い、図にしてみました。
(より厳密に実行端末が判断されるAd Hoc配布をベースに記述)
ざっくり手順(※個別の操作は省略)
-
鍵ペア(秘密鍵/公開鍵)を作成
※秘密鍵は端末内から外へ出ません -
公開鍵をCSR(証明書署名要求)として認証局(Apple)に送付
-
証明書発行
※受け取った公開鍵から証明書を作成し、認証局の秘密鍵で署名 -
発行された証明書をDLしてキーチェーンに登録
-
App IDを登録
-
実行を許可する端末を登録
※端末のUDID(複数) -
プロビジョニングファイルを作成
※証明書、App ID、実行許可端末を関連付け -
プロビジョニングファイルをDLして端末内に登録
-
配布したいアプリケーションにBundleID、コードサイニング(署名)の設定を行う
-
アプリケーションをビルド、アーカイブし、パッケージファイル(ipaファイル)を作成
※ipaファイルはZIP形式でまとめられており、プロビジョニングファイルを含む
※パッケージファイル全体に署名を施す
あらためて、動作条件
配布アプリが端末内で動作する条件は、以下の通りです。
・ アプリのBundleIDが、AppIDと一致
・ コードサイニング(署名)が正しい
・ 実行が許可された端末である
ということで、様々発生する可能性のある問題は、上記条件に合致しないケースとなります。
アプリのBundleIDが、AppIDと一致していない
・ Xcodeで設定したアプリのBundleIDと、プロビジョニングファイル内のApp IDが合っていない
Prefix,Suffix,ワイルドカードを含めて合致するかどうかなので注意
アプリの署名が正しくない
・ コードサイニング(署名)から発行元の正当性が確認できない
・ プロビジョニングファイル内の証明書内の公開鍵と、ビルド時に署名に使った秘密鍵がペアになっていない
合致する秘密鍵をインポートしないまま違う端末でビルドした、コードサイニングに用いる署名を間違った、など。
・ ipaファイルを手動でZIP展開し、一部を改変した
ファイルの一部が変わるとハッシュ値が変わるため、署名と一致しない(=不正)と判断されます。
コードサイニング証明書の仕組み
Digital Signature diagram ja - 電子署名 - Wikipedia
実行が許可された端末ではない
・ (アドホックの場合)プロビジョニングファイルに含まれる実行許可端末以外の端末で実行しようとしている
プロビジョニングファイルには実行許可端末のUDID(一意キー)が含まれているので、ipaファイルは実行許可端末を知っていることになります。
その他
・ ビルドやアーカイブ時など、Xcode上で表示されるプロビジョニングファイルがサーバの一覧を見ているのか、ローカル内の一覧を表示しているのかよく分かんないケースがあります。不要と思っても一応リフレッシュしてみるといいかもしれません。
・上図の通り、鍵ペア(秘密鍵・公開鍵)がポイントになります。鍵ペアを作った後に端末が壊れたりすると鍵ペアの秘密鍵のほうが無くなってしまい、公開鍵を含む証明書・プロビジョニングファイルが使えなくなります。秘密鍵はパスワードエクスポートして影響のない場所にバックアップしておくのが良いと思います。(キーチェーンアクセスにエクスポート機能があります)
さいごに
動作しない理由が分からないとイライラするものですが、上の条件がOKかどうか、一つずつ確認していくといいかと思います。(私のことですね)
お役に立てば幸いです。