Xcode6でのProvisioning File管理機能を検証 〜 ipa書き出しで悩む 編


はじめに

Xcode6からビルドしてアーカイブをipaファイルに書き出すときに
provisioning Fileを固定されるようになり、イロイロ困っています。

To upload an app to iTunes Connectより

In the dialog that appears, choose a team from the pop-up menu and click Choose.
If necessary, Xcode creates a distribution certificate and distribution provisioning profile for you. The name of the distribution provisioning profile begins with the text XC:.

この部分です。

Appleの方針が反映されつづけるのか、開発者の使い勝手を考えて仕様を変更してくれるかはわからないですが、現行で出来る対処を備忘録的に書きます。

追記

2014/12/18 Xcode6.1.1で個人用のAppleIDを設定している場合は
次のように、表示が変わっていました。

今度は同期機能は、個人では使えなくなっている?かを検証する必要がありそうです。

検証環境

  • iOSの開発者ライセンスStandard版(個人)
  • Xcode6.1
  • OS X Marvericks

困る点

  • XCとついたprovisioing FileがCertificates, Identifiers & Profiles生成される
  • XCなprovisioning Fileが指定しているビルド証明書が異なる場合がある
  • デバイスを限定した、自分で作成したprovisioing Fileを使いたくても使えない

XCとついたprovisioing File

Xcode6を使っている環境(Develoer、Agentの証明書など)は整っているのが前提とします。

対応するAppIDに対して、
Certificates, Identifiers & Profilesで、登録されている全てのデバイスが追加されているprovisioing Fileがない

と表示されて、Certificates, Identifiers & Profilesにprovisioning Fileが作成されます。

自動生成されないために

メッセージに書かれている通りであれば、Provigioning Fileに全デバイス登録すれば良いんだ。。。

と解釈して作成したら、できました。

ipa書き出し時に選択される証明書

provisioning Fileを何回か作成して、archiveから書き出す作業を繰り返して次のことが分かりました。

(1)全デバイス入り
かつ
(2)作成日付が最も最新なもの
が選択されます。

ない場合は、XCなファイルが自動生成されます。

プロビジョニングファイルの選択フロー

(1)アーカイブからipaのexportを選択する
(2)Certificates, Identifiers & Profilesからデバイスの一覧を取得(しているみたい)
(3)ローカルにキャッシュされているprovisioning fileから選択される

Certificates, Identifiers & Profilesから削除されたProvisioning Fileでも、ダウンロードしてXcode6に追加しておけば同期の影響を受けないようです。

invalidなprovisioning File

Certificates, Identifiers & Profilesでは
Provisioning Fileが更新されずにDeviceの増減があった場合に
invalidと表示されます。

ダウンロード出来ない状態になっています。

この場合、Xcode6で同期しても更新されず、削除もされないことを確認しています。

登録デバイスの増減

検証

Certificates, Identifiers & Profilesと同期して全てのprovisioning Fileを取得している状態から

デバイス減

(1)Certificates, Identifiers & Profilesからデバイスを削除する(Xcode6と同期しない)

(2)キャッシュしたprovisioning File

(3)Certificates, Identifiers & Profilesでは
削除されているデバイスが含まれているprovisioning File はinvalidになっています

削除されていないデバイスのみが含まれているprovisioning Fileはvalidになっています

(4)Xcodeでipaを書き出します。

invalidであるかどうかは関係ないようです。

(5)Xcode6とCertificates, Identifiers & Profilesを同期します

(6)再びXcodeでipaを書き出します。

Certificates, Identifiers & Profilesでデバイスが存在する、最新のプロビジョニングファイルが選択されました。

デバイス増

Accountsを同期をしたときに選択されたprovisioning Fileの中身です。

キャッシュされているXcode6の内容は下記の通り、Certificates, Identifiers & Profilesで当該のprovisioning Fileを更新しなければ、Xcode6で同期しても変更がかかりませんでした。

  <key>ProvisionedDevices</key>
  <array>
    <string>[削除していないデバイスのUUID]</string>
    <string>[削除して今回追加したデバイスのUUID]</string>
    <string>[削除したままのデバイスのUUID]</string>
  </array>

キャッシュしているprovisioning Fileに現時点での全端末が入っていれば
問題なく使えるようです。

追加したデバイスがキャッシュしているprovisioning Fileにない場合は
XCなprovisioning Fileが生成されました

運用を考える

Xcode6を使う場合は、Certificates, Identifiers & Profilesの登録している全デバイス追加が必須という前提です。

自分で作成したProvisioing Fileを使う場合

新規デバイスの追加時は必ずprovisioning Fileに追加して更新
ipa書き出し時にXCなProvisioning Fileが生成されるため

Provisioing Fileをダウンロードしておく
invalidになった場合にダウンロードが出来なくなるため
複数で一つの端末を使用する場合があれば同期を全くしない状況が想定できない。

XCなProvisioing Fileを使う場合

自分が製作しているアプリに関係しないデバイスがライセンスに追加されるたびに、XCなProvisioning Fileが作成されるならXCなProvisioning Fileで運用を考える方が正解なのかもしれません。

証明書との紐付け
デフォルトは最新の証明書が紐づけられます。
誰かが勝手に証明書を作って、どこにも書き出してなかったら、共有していなかったら?
新規にAgentの証明書を作るまでXCのプロビジョニングファイルは失敗し続けます。

証明書を複数個使用した運用を行っている場合は、XCode6の環境での証明書と
Certificates, Identifiers & ProfilesでのProvisioning Fileでの証明書を一致させて更新し、その後Xcode6で同期して、ローカルのprovisioning ファイルを更新します。

同じアプリ(Bundle Identifer)の開発では、同じ証明書を使うことにした方が運用上安全だと思います。

参考URL

Uploading Your App Using Xcode
https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/SubmittingYourApp/SubmittingYourApp.html#//apple_ref/doc/uid/TP40012582-CH9-SW1

さいごに

これはまだ検証中の内容から出た個人の見解でApple公式のものとは別、ということをご理解ください。
また追記します。