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を設定している場合は
次のように、表示が変わっていました。

![スクリーンショット 2014-12-18 8.37.52.png](https://qiita-image-store.s3.amazonaws.com/0/12362/da73a52f-2436-6b19-bceb-9e780927eb43.png)

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

#検証環境
* iOSの開発者ライセンスStandard版(個人)
* Xcode6.1
* OS X Marvericks

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

# `XC`とついたprovisioing File
Xcode6を使っている環境（Develoer、Agentの証明書など）は整っているのが前提とします。

![スクリーンショット 2014-11-01 8.30.23.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e5af19c1-4bf9-39ea-9cb1-ce303d72617b.png)

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

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

##自動生成されないために

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

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

##ipa書き出し時に選択される証明書
provisioning Fileを何回か作成して、archiveから書き出す作業を繰り返して次のことが分かりました。

（１）全デバイス入り
かつ
（２）作成日付が最も最新なもの
が選択されます。

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

###プロビジョニングファイルの選択フロー
（１）アーカイブからipaのexportを選択する
（２）`Certificates, Identifiers & Profiles`からデバイスの一覧を取得（しているみたい）
（３）ローカルにキャッシュされているprovisioning fileから選択される

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

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

![スクリーンショット 2014-11-02 8.19.53.png](https://qiita-image-store.s3.amazonaws.com/0/12362/ba37720a-66ae-0730-f974-4041d95d18f8.png)

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

![スクリーンショット 2014-11-02 8.41.07.png](https://qiita-image-store.s3.amazonaws.com/0/12362/a96fce2f-0c2c-84dd-73d0-fbf33b8e8d3f.png)

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

#登録デバイスの増減

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

###デバイス減
（１）`Certificates, Identifiers & Profiles`からデバイスを削除する（Xcode６と同期しない）

（２）キャッシュしたprovisioning File
![スクリーンショット 2014-11-02 6.29.32.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e5702abc-5a38-6cc7-6189-7c37e7318c92.png)

（３）`Certificates, Identifiers & Profiles`では
削除されているデバイスが含まれているprovisioning File はinvalidになっています
![スクリーンショット 2014-11-02 6.30.15.png](https://qiita-image-store.s3.amazonaws.com/0/12362/3207769d-38c8-36a1-a12b-37ce128f5c71.png)

削除されていないデバイスのみが含まれているprovisioning Fileはvalidになっています
![スクリーンショット 2014-11-02 6.30.25.png](https://qiita-image-store.s3.amazonaws.com/0/12362/69fa9970-dd97-8fea-2410-5a9980cde4f3.png)

（４）Xcodeでipaを書き出します。
![スクリーンショット 2014-11-02 6.29.51.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d4ce67e5-78cf-c153-8a91-b6204f8e752a.png)

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

（５）Xcode６と`Certificates, Identifiers & Profiles`を同期します
![スクリーンショット 2014-11-02 6.29.32.png](https://qiita-image-store.s3.amazonaws.com/0/12362/a81219ea-6aad-be24-fbf4-6fda9af63e95.png)

（６）再びXcodeでipaを書き出します。
![スクリーンショット 2014-11-02 7.07.03.png](https://qiita-image-store.s3.amazonaws.com/0/12362/888acfcc-e90d-bcb2-0e59-7c1036479ee4.png)

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

###デバイス増
Accountsを同期をしたときに選択されたprovisioning Fileの中身です。

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

![スクリーンショット 2014-11-02 8.23.45.png](https://qiita-image-store.s3.amazonaws.com/0/12362/419630c2-6702-c490-ea0a-4c9f9950e0d5.png)

```xml
  <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公式のものとは別、ということをご理解ください。
また追記します。