もっと楽に、ビルドなしでipa運用

#はじめに
XcodeのツールであるOrganizerを使うことで
provisioning Fileの差し替えを行うことでできます。
リビルドのない運用を考えてみました。

現時点でのこの記事はXcode5だけで有効な手段を書いています。

##Xcode6以降
xcarchiveの出力がGUIから見当たりませんでしたが
対象アーカイブの右クリックから保存フォルダを参照することが可能なことがわかりました。

コマンドラインでなくXcodeを使う上では、Appleとの通信による
プロビジョニングファイルの指定を意識する必要があります。

* 証明書
* 登録デバイス
* provisioning Fileを作成した順番

などを考慮する必要があります。

こちらに検証をまとめました。合わせて確認してください。
http://qiita.com/nofrmm/items/2bc60313aa961baf501f

#環境
 - Certificates, Identifiers & Profiles
 - Xcode5.1

#差し替え可能な条件
プロビジョニングファイルの差し替えについてのまとまっている資料は見つけられませんでした。
そのため、いくつか使用条件を探るテストをします。

- Xcode上で指定した以外のprovisioningFileは使用できるのか
- 異なるBundle Identifierで使用できるのか

##Xcode上で指定した以外のprovisioningFileは使用できるのか
###Certificates, Identifiers & Profiles

次の二つのadhocファイルを作成します。

- xcode上で指定:forAdhoc
- ipaを書き出すときに指定:forAdhoc2

for Adhoc
![スクリーンショット 2014-03-27 8.22.24.png](https://qiita-image-store.s3.amazonaws.com/0/12362/040e74f2-c7f2-23ed-a996-014349c85107.png)

ワイルドカードを使用したprovisioningFileです
***
for Adhoc2
![スクリーンショット 2014-03-27 8.22.54.png](https://qiita-image-store.s3.amazonaws.com/0/12362/00992908-73fa-c406-f9c6-6bd209c47a26.png)

こちらは固定のBundle Identifierです

このプロビジョニングファイルをダウンロードし、Xcodeへ追加しておきます。

###Xcodeでの指定
Build SettingsでProvisioning Fileを指定します
![スクリーンショット 2014-03-27 8.24.22.png](https://qiita-image-store.s3.amazonaws.com/0/12362/90f654be-84e6-5959-ceec-f8243302e4f3.png)

###Archive

OrganizerのArchivesタブで`Distribute`を押します
![スクリーンショット 2014-03-27 8.46.57.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d9a1c6e5-767b-51e9-7420-47317e8f0114.png)

Distributeボタンを押し、画像の通りの設定を選び`Next`
![スクリーンショット 2014-03-27 9.04.25.png](https://qiita-image-store.s3.amazonaws.com/0/12362/9f36aba5-8a6f-6563-e590-25d28e59c199.png)


いくつか選べる状態になっている中で`forAdhoc2`を選びます
![スクリーンショット 2014-03-27 7.55.48.png](https://qiita-image-store.s3.amazonaws.com/0/12362/52c5292c-779f-0fcb-0113-3ca2cbb14069.png)

###ipaファイルを確認
[他の記事](http://qiita.com/nofrmm/items/34916d8823d43e5f6c2f#2-2)であるので書くのは省きますが、ipaファイルを解凍し、Developer Provisioning Profile：mobileprovisionファイルの記述を確認します。

```xml:Payload/releaseTest.app/embedded.mobileprovision
	<key>Name</key>
	<string>forAdhoc2</string>
	<key>ProvisionedDevices</key>
	<array>
		<string>[deviceのUDID]</string>
	</array>
```

念のため、forAdhocのプロビジョニングファイルでexportしたipaも確認します。次のような記述がふくまれました

```xml:Payload/releaseTest.app/embedded.mobileprovision
	<key>Name</key>
	<string>forAdhoc</string>
	<key>ProvisionedDevices</key>
	<array>
		<string>[deviceのUDID]</string>
		<string>[deviceのUDID]</string>
		<string>[deviceのUDID]</string>
	</array>
```
##異なるBundle Identifierで使用できるのか
GUI上では選べませんでした。

![スクリーンショット 2014-03-27 7.55.48.png](https://qiita-image-store.s3.amazonaws.com/0/12362/52c5292c-779f-0fcb-0113-3ca2cbb14069.png)

この画像で表示されている選択可能なprovisioning Fileは、Bundle Identifierを元にフィルタリングされています。

##分かったこと
adhocで使用するデバイスの変更ではビルドはいらなさそう 

#こんな場合に使える？
##確認者によりexportするipaを変える
レイアウト変更確認は*：ワイルドカードなAppID指定で、Push通知、課金などはユニークなAppID指定が必要

##配信対象deviceの変更
ビルドするのに時間がかかるようなリッチなアプリは
確認端末の変更のたびに、OTA配信で問題があるたびにビルドをしていると、たまったものじゃないです。

##運用
 1. Xcode Archiveで運用
 2. プロビジョニングファイルを作成、ダウンロード
 3. Organizerでプロビジョニングファイルを変更

#さいごに
生成されたipaの有効期限は、プロビジョニングファイル（一年）とプロビジョニングファイルに指定した証明書の期限から短い方が選ばれます。
Standard版のライセンスだとStoreに出すのが前提なので、証明書の有効期限が短く一年、もしかするとリビルドが年に数回必要になるかもしれません。
Enterprise版だと現状三年なので運用しやすいような印象です。

証明書をかえたプロビジョニングファイルの検証はまた今度