iOS Developer Enterprise ProgramのIn-House配布のエラーがわかりにくい

iOS Developer Enterprise ProgramのIn-House配布環境構築中に遭遇したエラーがわかりにくかったのでメモしておきます。

"iTunes Storeに接続できません"
---
インストールリンクをタップすると"◯◯に接続できません"と表示され、デバイスログを見ると次のようなログが出ていました。

```
itunesstored[94] <Warning>: Could not load download manifest with underlying error: Error Domain=SSErrorDomain 
Code=2 "iTunes Storeに接続できません" UserInfo=0x17d4fdc0 {NSLocalizedDescription=iTunes Storeに接続できません}
```

なぜiTurns Storeが出てくるのか。

### 原因
マニフェストファイル内に余計なタグが混ざっていて、XML構造として正しいけれどマニフェストファイルとしては間違っているからでした。

### 余談
ダウンロードページ内のマニフェストファイルのURLが間違っている場合は

```
"example.comに接続できません"
```

のようなログがでます。
また、マニフェストファイル内のipaファイルのURLが間違っている場合はiPhoneの画面上に

```
Appはダウンロードできません
"アプリ名"は現在ダウンロードできません。
```

というダイアログが表示されます。

本題は以上です。以下はIn-House配布を試すときに用意したもの等のメモです。


用意していたもの
---
### ipaファイル
XcodeでArchiveし、"Save for Enterprise Deployment"で"Export"したもの。
AWS S3上に配置しました。

### マニフェストファイル(manifest.plist)
マニフェストファイルの必須項目は以下の通りです。

* `software-package` … ipaファイルのURL。
* `display-image` … インストール中に表示される画像ファイルのURL。57x57 pxのpng画像。ホーム画面に表示されてそのままアプリアイコンに置き換わるのでアプリアイコンと同じものが良いでしょう。
* `full-size-image` … 大きい画像ファイルのURL。512x512 pxのpng画像。In-House配布では表示されることは無いようですが必須項目のようです。
* `metadata` … アプリ名やバージョン等のメタ情報。

最小構成で以下の様になると思います。

```xml
<?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://s3-ap-northeast-1.amazonaws.com/bucket-name/path/to/your_app.ipa</string>
        </dict>

        <dict>
          <key>kind</key>
          <string>display-image</string>
          <key>url</key>
          <string>https://s3-ap-northeast-1.amazonaws.com/bucket-name/path/to/display-image.png</string>
        </dict>

        <dict>
          <key>kind</key>
          <string>full-size-image</string>
          <key>url</key>
          <string>https://s3-ap-northeast-1.amazonaws.com/bucket-name/path/to/full-size-image.png</string>
        </dict>
      </array>
      <key>metadata</key>
      <dict>
        <key>bundle-identifier</key>
        <string>com.example.your-app</string>
        <key>bundle-version</key>
        <string>1.0.0</string>
        <key>kind</key>
        <string>software</string>
        <key>title</key>
        <string>Your App Name</string>
      </dict>
    </dict>
  </array>
</dict>
</plist>
```

httpsでアクセスできる場所に設置する必要があるので、今回は画像ファイルと共にipaファイルと同じS3上に置きました。

### ダウンロードページ
アプリをダウンロードするユーザーに見せるページですが、今回は最低限のマニフェストファイルを含むHTMLをiPhoneからアクセスできるWebサーバーに置きました。

マニフェストファイルへのリンクは以下の通りです。

```html
<a href="itms-services://?action=download-manifest&url=https://s3-ap-northeast-1.amazonaws.com/bucket-name/path/to/manifest.plist">インストール</a>
```

ダウンロードページにはアクセス制限が必要ですが、今回はネットワーク的に制限されているので特に何もしませんでした。


すべてが適切な場合
---
iPhoneでダウンロードページを開き、インストールリンクをタップすると

    "◯◯"から"××"がインストールされます

というダイアログが表示され、インストールボタンをタップするとインストールが始まり、ホーム画面にアプリアイコンが追加されます。
_※ ◯◯はマニフェストファイルの置かれている場所のドメイン、××はアプリ名が入ります。_


エラーが発生した場合のエラーログの確認方法
---
iPhoneをMacにつなぎ、Xcodeの"Window"→"Devices"から接続したデバイスを選択します。
画面下の△ボタンをクリックするとデバイスのログが表示されます。