App ID's とアプリケーションのインストールについて

新規アプリケーションを開発するときなんかには、IDP で App ID's の発行とプロビジョニングファイルの発行を行う.

IDC には、このあたりの登録に関するドキュメントが転がっているが、いまいち何を設定していいのかわからなくて困ったのでちょっと調べてみた.

...全然まとまってないけれども、メモだからまぁいいか...

App ID ってなにするもの?

iPhone(macもか?)では、 Bundle って単位でアプリケーションとかリソースを管理している.

Bundle には、実行ファイル本体や実行ファイル中で利用するリソース(画像/サウンド/多言語対応用のファイル)なんかが含まれている.

このバンドルには、「Bundle Identifire」とよばれる識別子(?)が設定されていて、どうやら Bundle の識別を行うための名前になっているようだ.

Bundle Identifire は、慣例上 "com.apple.iTunes" のようにドメインを逆から記述する.

つまり、 私が "it_lives_vainly.co.jp" というドメインを持っていて、"MyShooting" というアプリケーションのバンドルを作成する場合には、 "jp.co.it_lives_vainly.MyShooting" のように記述することになる.

さて、App ID に話を戻す.

App ID は、キーチェーンのアクセスのために用いるための識別子となる.

この識別も、Bundle Identifire と同様の命名規則が*推奨*されている.

App IDは、後の行程でプロビジョニングファイルに埋め込まれ、適切な開発者によってアプリケーションがインストールされているのかの認証として機能する.

プロビジョニングファイル

プロビジョニングファイルには、

が埋め込まれており、不正な経路でのアプリケーションのインストールを防止する役割を持つ.

プロビジョニングファイルは、iPhone/iPod touch等の端末にインストールして用いる.

App ID の銘々

好きにやって良い.

けれども、アプリケーション毎に App ID を作成するのが面倒なら、ワイルドカードを用いることができる.

"jp.co.it_lives_vainly.*"

のように、 App ID を設定しておくと、"jp.co.it_lives_vainly.MyShooting" でも、"jp.co.it_lives_vainly.MyPazzle"でも同じプロビジョニングファイルを利用することができる.

また、App IDの登録時に、IDCが自分で登録した文字列の先頭に、10文字の識別文字を付加する.

すなわち、最終的な App IDは"##########.jp.co.it_lives_vainly.MyShooting" のようになる.
(# には、 IDC が付加した文字列が入る)


App ID の設定と、アプリケーションのインストール

プロビジョニングファイルと、アプリケーション側の Bundle Identifire の設定を適切に行わないと、アプリケーションのインストールが行えない.

アプリケーション側の設定で気をつけるべき点は

  • プロジェクトのプロパティにある"コード署名ID(CODE_SIGN_IDENTITY)"で適切なプロビジョニングファイルが選択されているか
  • info.plist の "Bundle Identifire" に、App ID で指定した文字列が記述されているか

の二点になる.

info.plist に記述する "Bundle Identifire" には、利用するプロビジョニングファイルに書き込まれている App ID と対応している必要がある.

また、このとき IDC が付加した 10文字の識別文字は必要ない.

すなわち、Bundle Identifire には、"jp.co.it_lives_vainly.MyShooting" のように設定する.

プロダクト名を示すマクロ変数 ${PRODUCT_NAME:identifier} を利用して記述する場合、

"jp.co.it_lives_vainly.${PRODUCT_NAME:identifier}"

こんなかんじに書けばよい.

ちなみに、info.plist のデフォルトでは、 "com.yourcompany.${PRODUCT_NAME:identifier}" のように書かれている.

なんとなく、App ID を作成するときに

App ID Name MyShooting
App ID

のように記述するとインストールできるけど、いざ App ID にドメインの指定を行おうと思うと動かないなんて人は、要チェック.
(...俺か)

また、App ID 登録時に、デフォルトが "jp.co.it_livs_vainly" といった感じなっているのが、陥りやすい罠.

アプリが転送できない人の大半はここではまっていると思われる.

設定を見なしてもインストールできない場合

いくら見直しても、間違えが見つからず、アプリケーションがインストールできない場合には、 xcode と端末の再起動をおこなうとどうにかなるかもしれない.

また、開発の途中でプロビジョニングファイルが変更された場合には、端末上に古いアプリケーションが残っていると意味不明のエラーで怒られるので、削除しておくこと.

(おまけ1) iPhone 構成ユーティリティ

xcode 付属のオーガナイザを利用すれば、端末へのプロビジョニングファイルやアプリのインストールやアンインストールが行える.

しかし、なぜか消したはずのプロビジョングファイルが、xcode のプロジェクト設定に現れてしまうことがある.
(一覧に表示するプロビジョニングファイルは、端末にインストールされているものではなく、mac上のファイルだからか?)

そんなときは、 iPhone 構成ユーティリティから削除すると良い.

いままで存在を知らなかったけれども、複数の端末を利用するようになるとかなり便利.

http://support.apple.com/downloads/iPhone_Configuration_Utility_1-1_for_Mac_OS_X?viewlocale=ja_JP

ちうか、開発するならインストールしといて損はない

(おまけ2) App ID と Bundle の関係

よく分からない.

Bundle Identifire と App ID が対応するのであれば、同じ App ID を持つアプリケーションは、 Bundle を共有できたりするんだろうか?

例えば、App ID を "jp.co.it_lives_vainly.*" として設定した場合、"jp.co.it_lives_vainly.MyShooting" と "jp.co.it_lives_vainly.MyPazzle" で App ID を利用することができるが、MyShooting から MyPazzle のBundle をオープンしたり書き込んだりできるんだろうか?

(教えて偉い人)