ややこしいiOSアプリ配布方法の俯瞰とケースバイケースの配布方法選定

## はじめに

　iOSのNativeアプリケーションの配布には、Apple Developer Programや企業向けのApple Developer Enterprise Programといった有償開発ライセンスの制約が付き纏います。これらライセンスの概要に明るくない人は**「何なのだ、これは！ どうすればいいのだ？！」**と混乱することが多いと思うので、2018年現在でのiOSアプリの配布をケースごとに整理してみたいと思います。

## 対象読者
- iOSアプリの開発を最近はじめた人
- 企業でApple Developer Programの管理を急に任された人
- お客さんにライセンス周りの説明をしないといけない人

## Apple Developer (Enterprise) Program
　AppleはiOS Native アプリを開発する個人・企業向けに有償ライセンスを提供しています。最近ではライセンスレスでアプリを実機実行できる仕組みもサポートされましたが、あくまで手元でデバッグ実行する用途でしか使えず、プッシュ通知等の機能も試せないため、本格的にアプリ開発・配布する場合はライセンス購入が必須です。

　企業向けには以下の2種類のライセンスが提供されています。

- Apple Developer Program($99/年)
  - AppStore配布用 
- Apple Developer Enterprise Program($299/年)
  - 企業内配布用

<font color="red">※ライセンス料金の為替レートは不定期に変更されます。複数年払いも出来ません。</font>
※Apple Developer Programは個人開発者向けのライセンスも提供されていますが、チーム利用を想定した機能(ユーザ毎の権限管理)が使えません。

　2つのライセンスの**大きな違いは配布先**です。単純にAppStoreにアプリを公開するかどうかでライセンスを選ぶことが多いですが、**個人的にはApple Developer Enterprise Programだけ契約するのはオススメしません**。「え～！？ 企業内配布しかしないから、Apple Developer Program要らないよ！」という人も**Apple Developer Programを契約しておくと良いことがあります**。ネタバレをすると**お試し配信機能であるTestFlightを上手く使うと、配布パターンが増えるので非常に重宝**します。

## アプリの配布方法一覧
　Apple Developer ProgramとApple Developer Enterprise Programの違いを考慮して、採用可能な配布方法を検討すると以下の表のようになります。

|配布方法        |配布可能な範囲    |配布可能台数|審査要否|アプリ有効期限|ADP|ADEP|
|---            |---              |---        |:---:  |:---:|---|:---:|:---:|
|AppStore   |不特定多数        |制限なし    |必要|無限|○    |☓    |
|カスタムB2B  |指定した特定の組織内|制限なし   |必要 |無限|○    |☓    |
|TestFlight(内部テスター) |ライセンス契約企業内|25ユーザ|不要|90日|○|☓|
|TestFlight(外部テスター) |指定したユーザ     |10,000ユーザ|必要|90日|○|☓|
|Adhoc     |ライセンス契約企業内|開発デバイス登録可能数|不要|1年|○    |○    |
|InHouse   |ライセンス契約企業内|制限なし    |不要|1年|☓     |○    |

　それぞれの配布方法について簡単に解説しておきます。

### AppStore
　BtoC向けにアプリをAppStore基盤で公開する方法。アプリバイナリは海外サーバに置かれるため、輸出管理などの作業が要る。1度インストールするとOSとの互換性がなくなるまで動かし続けられる。

### カスタムB2B
　AppStore基盤を活用して特定の企業向けにアプリを公開する方法。言わば、**利用者を限定したAppStore配信**。アプリアップデートについてもAppStoreと同じように機能する。配布先の企業がAppleのVPP(Volume Purchase Program)に加入している必要はある。**特定企業向けの配布ではあるが、審査は発生する**ので注意すること。アプリ自体を無料で公開して、発注元と発注先で別途、費用のやり取り(アプリ数に関わらず○○万円とか)をするビジネスでも使える。

### TestFlight
　これもAppStore基盤を活用した配布方法。特徴は**アプリのベータ版配信に特化**しているという点にある。**開発途中のアプリやリリース前のアプリを誰かにお試しで使ってもらいたいというケースで重宝する**機能だ。特に**「外部テスター」はライセンス規約に違反することなく、社外関係者(お客さん、パートナーさん)にアプリを配布できる数少ない手段**であることを抑えておきたい(あくまでベータ配信なので90日しか使えないが)。冒頭で「Apple Developer Programは持っておいた方がいい」と書いた理由はここにある。ただし、<font color="red">「外部テスター」の場合はAppleの審査が発生する</font>点に注意。

### Adhoc
　配布先の**デバイスのUDID(個体番号)を指定したアプリ配布**方法。AppStoreとは全く関係がなく、MDM機能やWebサーバからのOTA配信など個別に配布手段を考える必要がある。基本的に、Apple Developer (Enterprise) Programの名のもとに提供される資産・情報は契約企業内でしか使うことが出来ないので、**ビルド成果物であるアプリも契約企業外に流出しないような仕組みを持っておくことが必要**だ。**Adhocでは登録されていないデバイスでのアプリ実行は不可能**であるため、比較的このルールを守りやすい配布方法だと言える。(<font color="blue">逆にいうと、配布先がコロコロ変わるようなケースだと、その度に再ビルドが必要で手間がかかる</font>)

　注意事項として、最長1年に1回Provisioning Profileの更新作業と最長3年に1回(ビルド時に使った証明書の期限)はメンテナンスが必要である。この**メンテナンス作業を怠ると、ある日突然アプリが使えなくなる**。

- Provisoning Profileの更新
  - アプリの再ビルドは不要
  - Apple Developer Member CenterでProfileを更新して再配布(MDMが推奨？)
- 証明書の更新
  - アプリの再ビルドが必要
  - アプリ自体の再配布が必要

　上記のように対応内容が変わるので注意。  

### InHouse
　**Adhocから配布先デバイスの指定を除外したアプリ配布**方法。そもそも配布先デバイスを意識しない仕組みのため、**利用者数が増減してもバイナリに影響は出ない**点が最大の特徴である。一方で<font color="blue">意図しない関係者(ライセンス契約企業ではない人)でもアプリを実行出来てしまうリスクはあり、Adhocに比べるとライセンス遵守のコストは高くなる</font>。入手元のサイトに認証機能を付けるなど検討が必要。

　注意事項として、Adhocと同様に最長1年に1回Provisioning Profileの更新作業と最長3年に1回(ビルド時に使った証明書の期限)はメンテナンスが必要である。この**メンテナンス作業を怠ると、ある日突然アプリが使えなくなる**。

## 開発途中のアプリをお試しで配布したい時は？
　このケースは**配布先が誰か**によって判断します。あくまで”開発途中”なので、本番リリースの手段である「AppStore」「カスタムB2B」は除外して考えると、以下のようになると思います。

- 同じ企業に所属している誰かに配る
  - TestFlight(内部テスター)
  - TestFlight(外部テスター)
  - Adhoc
  - InHouse

|配布方法        |配布可能な範囲    |配布可能台数|審査要否|アプリ有効期限|ADP|ADEP|
|---            |---              |---        |:---:  |:---:|---|:---:|:---:|
|TestFlight(内部テスター) |ライセンス契約企業内|25ユーザ|不要|90日|○|☓|
|TestFlight(外部テスター) |指定したユーザ     |10,000ユーザ|必要|90日|○|☓|
|Adhoc     |ライセンス契約企業内|開発デバイス登録可能数|不要|1年|○    |○    |
|InHouse   |ライセンス契約企業内|制限なし    |不要|1年|☓     |○    |

　判断基準としては「**Appleの審査が入っても問題ないか**」「どれぐらいの規模で配布するか」という点だと思います。仕様レベルでの変更を余儀なくされるケースもあるので、最終的にInHouseで配信を意図しており、やむを得ずAPIの用途外利用をするような場合は問題になります。

- お客さんやパートナーさんなどの社外関係者に配る
  - TestFlight(外部テスター)
  - (お客さん・パートナーさんのライセンスを使った)AdHoc
  - (お客さん・パートナーさんのライセンスを使った)InHouse

|配布方法        |配布可能な範囲    |配布可能台数|審査要否|アプリ有効期限|ADP|ADEP|
|---            |---              |---        |:---:  |:---:|---|:---:|:---:|
|TestFlight(外部テスター) |指定したユーザ     |10,000ユーザ|必要|90日|○|☓|
|Adhoc     |ライセンス契約企業内|開発デバイス登録可能数|不要|1年|○    |○    |
|InHouse   |ライセンス契約企業内|制限なし    |不要|1年|☓     |○    |

　こちらは基本的にTestFlightの外部テスターを使うのが無難だと思います。もし、配布先が技術に明るく、ソースコードを開示して問題ないのであれば、配布先でInHouseやAdhocビルドして使ってもらっても良いでしょう。

## 特定範囲に限定してアプリを本番配布したい時は？
　これは受託開発でよくあるケースです。発注元のお客さんの社内で使われるアプリを納品する際なんかも以下のパターンのどれかを選ぶ形になるでしょう。

- カスタムB2B
- (発注元ライセンスを使った)AdHoc
- (発注元ライセンスを使った)InHouse

|配布方法        |配布可能な範囲    |配布可能台数|審査要否|アプリ有効期限|ADP|ADEP|
|---            |---              |---        |:---:  |:---:|---|:---:|:---:|
|カスタムB2B  |指定した特定の組織内|制限なし   |必要 |無限|○    |☓    |
|Adhoc     |ライセンス契約企業内|開発デバイス登録可能数|不要|1年|○    |○    |
|InHouse   |ライセンス契約企業内|制限なし    |不要|1年|☓     |○    |

　判断基準としては「**Appleの審査が入っても問題ないか**」「配布基盤を自分で用意する準備があるか」「配布数がどれだけ変動するか」という点だと思います。

## ライセンスを持たない企業に配布したい時は？
　受託開発などで配布先が大企業のケースで問題になるパターンです。お客さんから「うちが作ったアプリを複数の子会社で使ってもらいたい」と言われることも多いと思います。ここでの問題は**全ての子会社さんにApple Developer (Enterprise) Programを契約してもらうか？**という点ですね。企業活動レベルでいえばライセンス料は安い方でしょうが、契約までの手続き(社内稟議やDUNS-Number取得)を考えれば簡単ではないでしょう。その場合は以下のどれかのパターンから選ぶことになるでしょう。

- カスタムB2B
- (発注元ライセンスを使った)InHouse

|配布方法        |配布可能な範囲    |配布可能台数|審査要否|アプリ有効期限|ADP|ADEP|
|---            |---              |---        |:---:  |:---:|---|:---:|:---:|
|カスタムB2B  |指定した特定の組織内|制限なし   |必要 |無限|○    |☓    |
|InHouse   |ライセンス契約企業内|制限なし    |不要|1年|☓     |○    |

　(発注元ライセンスを使った)InHouse……？　あれ、これOKなの？！　という感じですが、Apple Developer (Enterprise) Programの規約に記述があります。**業務委託契約を結んでいる企業・個人についてはライセンスの名のもとに提供されている資産・情報を利用する権利が認められています**。よって、**親会社・子会社の間で明確に業務委託であるという証拠が提示できるのであれば、親会社のライセンスでビルドされたアプリを子会社が使うことも大丈夫**です。<font color="red">※そこまで英語・法律に精通しているわけではないので、鵜呑みにせずにお手元のライセンス規約をよく確認してください(汗)</font>

　ただし、**業務委託契約外になった瞬間にライセンス違反**になりますので、管理はしっかり行っていく必要があります。例えば、業務委託先の企業でアルバイトしていた人が個人のiPhoneにアプリを入れていてアルバイトを辞めた場合とかですね。ちゃんとアプリを消してから辞めてもらいましょう。個人的には**MDMでの管理とセットの運用でないと厳しいかなーという見解**です。

## あとがきという名の個人的疑問
　「Adhoc配布だと契約企業外に配ってもOK」という情報をたまに見かけるのですが、これって本当に大丈夫なのでしょうか。ライセンス規約のどこにも明確に書いてなかったと思うので、本当に信じていいのか困っています。特に大きな企業さんとの契約時にエビデンスを求められることがあって、その場合に「ネットで何か書かれてました」「Appleさんが口頭で言ってました」だと辛いです。

　個人的には**業務委託契約**で縛って対応するのが無難だと思っています。

　<font color="red">2018.4.19追記。</font>
「Adhoc配布だと契約企業外に配ってもOK」の根拠というほど確実ではないですが、それっぽい記述を見つけました。

- [テスト用にアプリケーションをエクスポート（iOS、tvOS、watchOS）](https://developer.apple.com/jp/documentation/IDEs/Conceptual/AppDistributionGuide/TestingYouriOSApp/TestingYouriOSApp.html)

> 注意：Apple Developer Enterprise Programの会員は、iTunes Connectを利用できないので、アプリケーションのベータテストを実施する際には、この方法を用います。

　ということなので、基本方式的にはTestFlightを使うものの、それが使えない事由があるのであればAdhocを使ってもいいと言っているような気がします。iTunes Connect(≒TestFlight？)という単語があるので、おそらくライセンス所有企業ではない組織・個人への配布も含んだ文章だと解釈できそうですね。この内容がライセンス同意書本文に書いてあれば言うことなしなのですが……。