複数の App ID Prefixとキーチェーンについて

複数の App ID Prefixとキーチェーンについて


先日、Appleから「複数のApp ID Prefixについて」(Technical Note TN2311:Managing Multiple App ID Prefixes)というTechnical Noteが出ていました。
ふだんあまり意識することのない App ID Prefixですが、使い方を間違うとキーチェーンに保存されたデータを消してしまうこともあるんです。
古参の iOS Developerと、キーチェーンを使ってる Developerは要確認です。

App ID Prefixとは何か

App IDは、App ID PrefixとBundle Identifierの二つの部分にわかれています。
App ID Prefixが「ABCDE12345」でBundle Identifierが「org.toyship.testapp」なら、App IDは「ABCDE12345.org.toyship.testapp」となります。
ふだん、アプリの識別子としては、 Bundle Identifierだけを意識することが多いと思うんですが、実はBundle Identifierは識別子の一部なんです。

App ID Prefixとは、アルファベットと数字の組み合わせでできている10桁の文字列で、それぞれのDeveloperごとに異なる文字列になるようにAppleから与えられています。
他のDeveloperと同じApp ID Prefixになるということはあり得ません。

また、実はこの App ID Prefixは、以前は複数作成することができましたが、2011年6月のWWDC以降は追加ができなくなっています。
2011年6月より前にDeveloper登録をしていれば 、iOS DevCenterでApp ID Prefixの追加ができましたが、2011年6月以降はApp ID Prefixの追加はできません。
それまでに作成したApp ID Prefixはそのまま使えるので、古くから iOS Developer登録をしているDeveloperは複数の App ID Prefixを持ったままで開発が続けられますが、新規のDeveloperはAppleから与えられたデフォルトのApp ID Prefix(Team IDとよばれます)しか使うことができないので、この値を意識することはあまりなかったと思います。

私は2009年からiOS Developer登録をしているので、Team IDのほかに4つのApp ID Prefixを持っています。

AllTeamID

こんな感じで、メインのTeam IDの「B7X*******」に加え、「35F*******」「35L*******」「H55*******」「X9L*******」の4つのApp ID Prefixがあり、新しくApp IDを作るときにはその5つのうちから好きなものを選ぶことができます。

App ID Prefixが複数あると何ができるのか

で、このApp ID Prefixを複数持っていると何がいいのかというと、実は利点は全くありません。
というより、App ID Prefixが一つの方が利点がいろいろとあります。

App ID Prefixが一つの場合の利点はこちら。

  • App配布のときに、ミスマッチをふせげる。
  • 同じApp ID prefixならキーチェーンデータをシェアできる。
  • iOS7では同じApp ID prefixならUIPasteboardをシェアできる。

私が持っているアプリで説明すると、まずこちらのアプリ(ToyLog)はApp ID Prefixが「35F*******」です。
ToyLog

そして、こちらのアプリ(ToyLogLite)もApp ID Prefixが「35F*******」です。
ToyLogLight

ですので、上の二つのアプリは、二つのアプリでキーチェーン情報が共有できます。
両方のアプリを持っているユーザーは、片方のアプリでキーチェーンに保存したデータをもう一方のアプリで読み込むことが可能です。

ToyJig

ただし、こちらのアプリの(ToyJigsaw)では、「B7X*******」のApp ID Prefixを使っているので、上記の二つのアプリとキーチェーン情報をシェアすることはできません。

App ID Prefixとキーチェーンの関係

ここまで読むと、じゃあ複数のApp ID Prefixがある場合にはTeam IDに統合したほうが便利かな……と思うかもしれませんが、その前に注意しなくてはいけないことがあります。

実は、このApp ID Prefixを変更すると、以前保存していたキーチェーンデータにアクセスできなくなってしまうんです。

上のアプリの例で説明すると、ToyLogとToyJigsawで同じキーチェーン情報を共有しようと、ToyLogのApp ID Prefixを「35F*******」から「B7X*******」に変更したとします。
そうすると、バージョンアップ前にToyLogでキーチェーンに保存していた情報がバージョンアップした段階で読めなくなってしまいます。
(バージョンアップした後に保存した情報を読むことは可能です。)

ですので、キーチェーンを使っているアプリは、App ID Prefixを変更すると一旦それまでに保存したキーチェーン情報が失われることを想定して移行処理を設計する必要があります。
(例えばセキュリティ的に許容範囲であれば、一時的にNSUserDefaultsに保存するとか。)

AppleもApp ID Prefix統合については、特に必須としていません。
現時点でキーチェーンを使っているアプリは無理にApp ID Prefixは統合せず、そのままにしておくのがよいと思います。

App Tranfer

ただ、このApp ID Prefix変更を回避できない場合もあります。

少し前から、iOS Dev CenterのApp Tranfer機能で、アプリをApp Storeにで販売したまま、販売するDeveloperを変更することができるようになりました。

上に書いたように、App ID Prefixは全てのDeveloperで違う値となっています。
だから、App TransferでDeveloperが変更されるとApp ID Prefixも必ず変わってしまいます。
Developerを変更してバージョンアップすると、以前保存したキーチェーン情報には必ずアクセスできない状態となります。

App Transferでは、これを想定してバージョンアップ処理を設計する必要があります。

これについては、実際に被害にあった@DayBySayさんの【iOS】AppTransferしたらキーチェーンにアクセスできなくなった話も読んでいただくとよいと思います。

まとめ

要点をまとめると、

  • 複数のApp ID Prefixを持っていてもあまりいいことはない。できれば一つのTeam IDにまとめたほうがいい
  • ただし、App ID Prefixを変更すると、今まで保存してたキーチェーンデータにアクセスできなくなる
  • App Transferでアプリを移譲すると、今まで保存していたキーチェーンデータのアクセスができなくなる

です。
キーチェーンを使ってる方は特に気をつけてくださいね。

リンク

Photo : Some rights reserved by abuckingham