Xcode7でipaを書き出し、OTAで配信まで


#はじめに
毎年同じお題で書いている気がします。
XcodeがメジャーアップするたびにAppleさんは微妙に変えてくる。

ソース管理から配信までCI環境が整っている場合、これはこれでCIサービスが止まった場合に
困る人がいるかと思います。
あとは、非技術者の人も手を動かせるように、こちらにまとめておきます。

#前提
##bitcodeをONにしてみました

Xcode7で開発を始めたら、`ON`にするのが普通になるかと思うので
ここはデフォルトのままにしておきました。
![スクリーンショット 2015-10-06 23.02.00.png](https://qiita-image-store.s3.amazonaws.com/0/12362/bd7dd1eb-c37d-2c56-9f0e-5e3ef8932e3a.png)

##プロジェクトで使用する言語
もうswiftが主流ってことで、この言語で。
おそらくObj-Cでも同じだと思っているからですが、違ったらコメント下さいませ。

#ipa書き出し

##アーカイブのExportボタンを押す
![スクリーンショット 2015-10-06 23.39.32.png](https://qiita-image-store.s3.amazonaws.com/0/12362/53d68e4c-1447-3fd1-4585-67afd6cc6494.png)

##exportするipaの用途を選ぶ

今回はadhocで
![スクリーンショット 2015-10-06 23.39.54.png](https://qiita-image-store.s3.amazonaws.com/0/12362/117bb78b-2848-40f1-055f-3a7cbb090504.png)

##Thining
iOS9以上をターゲットとしてビルド、アーカイブした場合はThiningが使えます。
iOS9未満だと使えず、選べるのは`all compatible devices`な書き出しです。

![スクリーンショット 2015-10-06 23.40.12.png](https://qiita-image-store.s3.amazonaws.com/0/12362/35d6acd9-4432-59fc-d44f-fd1a1ca87b4f.png)

## 出力に関する設定もろもろ

赤い枠をつけたのは下記項目です。

 - OTAに使用するmanifest.plistを出力
 - iTunesConnectにアップロードしたbitcodeからExport

 `Next`ボタンを押すと実行されます。

![スクリーンショット 2015-10-06 23.41.25.png](https://qiita-image-store.s3.amazonaws.com/0/12362/fe8db4ce-f7fe-7c7b-22f3-e861ff7d72cc.png)

## 書き出し

デスクトップにフォルダが作成されます。

>[アプリ名] [作成年月日時刻]

![スクリーンショット 2015-10-06 23.41.45.png](https://qiita-image-store.s3.amazonaws.com/0/12362/22823b9a-9cab-61b6-7473-e21dfcd37260.png)

フォルダにはipaと、manifest.plistの出力を設定していればこのファイルも一緒に書きだされます。

#OTAのマニフェストファイルを書き出し

アーカイブから書き出すときにOTAのマニフェストファイルも一緒に書き出すことができます。
画像の赤枠のチェックをいれて `Next`ボタンを押すと実行されます。

![スクリーンショット 2015-10-07 11.28.13.png](https://qiita-image-store.s3.amazonaws.com/0/12362/63bdbccc-c84d-344b-d6f5-6b2603dffb23.png)

bitcodeから書き出す場合は赤枠の下のチェックボックスもONにするといいです。

##マニフェストファイルの情報

 - 配置するipaのURL
 - 57ピクセルサイズのpngのURL
 - 512ピクセルサイズのJpeg（pngでもいいような・・・）のURL

![スクリーンショット 2015-10-06 19.34.19.png](https://qiita-image-store.s3.amazonaws.com/0/12362/74303033-ff0f-b8be-e287-6717830cd247.png)

##書き出し

デスクトップ上に書きだされます。
![スクリーンショット-2015-10-07-11.53.07.png](https://qiita-image-store.s3.amazonaws.com/0/12362/8541427b-571e-e02c-166d-b01c4174fe14.png)

manifest.plistは次のような感じに出力されます。
>諸々の情報はデフォルトで設定しているものを書いていますので、各々書き換えてください。

```xml:manifest.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>items</key>
	<array>
		<dict>
			<key>assets</key>
			<array>
				<dict>
					<key>kind</key>
					<string>software-package</string>
					<key>url</key>
					<string>https://www.example.com/apps/foo.ipa</string>
				</dict>
				<dict>
					<key>kind</key>
					<string>display-image</string>
					<key>url</key>
					<string>https://www.example.com/image.57x57.png</string>
				</dict>
				<dict>
					<key>kind</key>
					<string>full-size-image</string>
					<key>url</key>
					<string>https://www.example.com/image.512x512.jpg</string>
				</dict>
			</array>
			<key>metadata</key>
			<dict>
				<key>bundle-identifier</key>
				<string>jp.hoge.huga.OTAProg</string>
				<key>bundle-version</key>
				<string>1.0</string>
				<key>kind</key>
				<string>software</string>
				<key>title</key>
				<string>OTAProg</string>
			</dict>
		</dict>
	</array>
</dict>
</plist>

```

これをそのままWebサーバ（SSL設定済み）に置く場合は、指定した画像ファイルも一緒に置かないとダウンロードで失敗します。（失敗しました）

そのため、画像を置くのがない場合など
出力されたmanifest.plistの一部をコメントアウトします。

```xml:manifest.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>items</key>
	<array>
		<dict>
			<key>assets</key>
			<array>
				<dict>
					<key>kind</key>
					<string>software-package</string>
					<key>url</key>
					<string>https://www.example.com/apps/foo.ipa</string>
				</dict>
<!--
				<dict>
					<key>kind</key>
					<string>display-image</string>
					<key>url</key>
					<string>https://www.example.com/image.57x57.png</string>
				</dict>
				<dict>
					<key>kind</key>
					<string>full-size-image</string>
					<key>url</key>
					<string>https://www.example.com/image.512x512.jpg</string>
				</dict>
-->
			</array>
			<key>metadata</key>
			<dict>
				<key>bundle-identifier</key>
				<string>jp.hoge.huga.OTAProg</string>
				<key>bundle-version</key>
				<string>1.0</string>
				<key>kind</key>
				<string>software</string>
				<key>title</key>
				<string>OTAProg</string>
			</dict>
		</dict>
	</array>
</dict>
</plist>

```

## 配置例

htmlフォルダをドキュメントルートとして各ファイルを配置した一例です。

- html
    - index.html
    - apps
        - foo.ipa
        - manifest.plist

に使うHTMLにaタグリンクをつける場合の例です。

```html:index.html
<html>
<head><title>title</title></head>

<body>
<a href="itms-services://?action=download-manifest&url=https://www.example.com/apps/manifest.plist">install</a>
</body>
</html>

```

#配置するWebサーバ側

##mimetype

plist、ipaファイルのmimetypeを設定する必要があります。

plistは`text/xml`
ipaは`application/octet-stream`

nginxでは

`/etc/nginx/mime.types`に追加しました。

```nginx:mime.types
types {
# 他のmimetype

# for OTA
    text/xml                              plist;
    application/octet-stream              ipa;

# 他のmimetype

}
```
## SSLのプロトコルとか
sakuraのVPSで作った環境で確認しているところでは
TLS `v1.1` `v1.2` で問題は起きていません。

上記プロトコルに限定したSSLの設定は下記に書いています。
http://qiita.com/nofrmm/items/5e50f077eb1602a3458e

#はまりどころ

 - ipaが壊れている
 - マニフェストの書き方が間違っている
 - Appleのインフラがおかしい
 - サーバの設定が足りない
    - SSLの設定
    - mimeType
    - フォルダ、ファイルの読み取り権限

# 参考URL

社内 App をワイヤレスでインストールする
http://help.apple.com/deployment/ios/#/apda0e3426d7

#さいごに
ひさびさに手書きでOTAのファイルを書いてみました。
はまりどころはサーバ側も含めて知識があればピンとくるところをまとめています。
アプリだけを作っているとわからないところも出てくると思うので、有料サービスや制限のある無料サービスだけじゃなく自分でサーバを立てるところもやれると素敵かなと思います。