Xcode11でiOSアプリのTestFlight配布の流れ

## はじめに
### どんなニーズに向けて？
- 開発者以外がApple Developer Accountに登録することになった場合
- 個人アカウントでApple Developer Accouontに登録して複数人で開発したい場合
- iOSベータ版配布までの一連の流れをとりあえず知りたい場合

### 誰のため？

**非開発者かつAccount Holder（Apple Developer Accountを開設した者）**
[5. （他の）開発者に開発に必要なファイルを渡す](#5-他の開発者に必要なファイルを渡す)まで進めてください。
またこの場合は、開発者に以下のことを事前に聞いておくとスムーズです。

- 開発に用いるデバイスのUDID [（3.3 開発者デバイスの登録）](#33-開発デバイスの登録)
- 開発者のメールアドレス

**開発者かつAccount Holder**
全部のステップ

**開発者**
[6. Xcodeでの手続き](#6-xcodeでの手続き)以降を進めてください。

### 前提環境
Xcode 11

## 概要
[1. 用語整理](#1-用語整理)
[2. Apple Developerに登録する](#2-apple-developerに登録する)
[3. Apple Developerで手続きをする](#3-apple-developerで手続きをする)
[4. App Store Connectで開発者や内部テスト参加者などを登録する](#4-app-store-connectで開発者や内部テスト参加者などを登録する)
[5. （他の）開発者に開発に必要なファイルを渡す](#5-他の開発者に必要なファイルを渡す)
[6. Xcodeでの手続き](#6-xcodeでの手続き)
[7. Xcodeでゴリゴリ開発する](#7-xcodeでゴリゴリ開発する)
[8. Xcodeでベータ版を配布する](#8-xcodeでベータ版を配布する)

## 事前準備


##1. 用語整理
### Acount Holder
Apple Developer Accountを開設した（支払いをした）メールアドレスに紐付けられた権限ユーザー。
Account Holderの協力がないと開発ができません。

### [Apple Developer Account](https://developer.apple.com/account)
開発や配布に必要な証明書・ID・プロファイルの作成をするプラットフォーム
※ Account Holderしかできません

### [App Store Connect](https://appstoreconnect.apple.com/apps)
開発中のアプリの管理をするプラットフォーム。
旧iTunes Connect。古い記事をググる時は注意してください。
主な役割は、

- App Store申請
- TestFlight管理
- **チームの管理**

**※Apple Developerでメンバーの追加はできないので注意。古い記事だとできるって書いてあるができません。**


### TestFlight
ベータ版の配布を可能にする超便利な配信サービス。
通常iOSアプリの配布というとApp Storeにアプリを載せることですが、その前段階としてベータ版の配布をすることができます。
指定したユーザーのメールアドレスを招待あるいは公開リンクを発行するだけで、ベータ版をダウンロードしてもらうことができます。
TestFlightについては以下で丁寧にまとまっています。
参考: [TestFlightを今更まとめてみた](https://qiita.com/haseken_dev/items/8c094b44c7e67836b74d)

### Xcode
開発・ビルド・配布アプリのアップロードなどをする統合開発環境

##2. Apple Developerに登録する
これはググったら結構情報出てきます。
アカウントの種類は個人と組織（主に企業向け）の2つがありますが、詳しい用件はApple Developer Programの[登録のために必要な情報](https://developer.apple.com/jp/programs/enroll/)で丁寧に書かれています。
組織として登録するには手続きが増えて時間もかかりそうなので、早めに着手するとよさそうです。
参考: [Apple Developer Programに法人として参加する](https://qiita.com/moco3/items/4602ffbf4e60b7e35037)

##3. Apple Developerで手続きをする
基本的に[[iPhone] iOSアプリを登録、申請して公開するまで](https://i-app-tec.com/ios/app-release.html)に沿ってやって頂ければ問題ありません。しかし少々情報が古いので補足する形で以下書いております。
まずは、Apple Developerのアカウントページの[Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/certificates/list)から始めましょう。
注意点としては、組織アカウントでない限り、Account Holderしかこの章の手続きはできないです。後述のApp Store Connectで追加されたメンバーではできません。

###3.1 iOS Certificateの発行
- ```Certificates```タブから開発用（```Apple Development```）と配布用（```Apple Distribution```）の両方を作成します
- 参考リンクでは```iOS App Development```と```iOS App Distribution```を選択するようになっていますが、Xcode11以降では```Apple Development```と```Apple Distribution```を選択しましょう。これを間違えると、後述するProvisioning ProfileをXcodeで読み込めなくなりビルドができない状態になります。
![スクリーンショット 2020-08-27 17.09.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170348/a08faa84-66a2-6479-7553-fdab10ca96bd.png)

参考: [[iPhone] iOS, Certificate 証明書を作ってみる](https://i-app-tec.com/ios/apply-application.html)

###3.2 iOS App IDsの登録
- ```Identifiers```タブからアプリにつき一つずつ作成します
- ```com.hogehoge```とcom.から始めたものを作るそうなのでそうするのがいいかと思います

参考: [[iPhone] iOS App IDs を登録する](https://i-app-tec.com/ios/ios-app-ids.html)

###3.3 開発デバイスの登録
- ```Devices```タブから開発に用いるデバイスの登録をします
- 登録するにはデバイスのDevice ID(UDID)を知っている必要があります

参考: [デバイスID確認方法【iPhone UDID】](https://teachme.jp/35563/manuals/2074444)
 
###3.4 Provisioning Profileの作成

- ```Profiles```タブから開発用（```iOS App Development```）と配布用（```App Store```）の2つを作成します
- 区別できるように、それぞれ```Development```や```AppStore```などファイル名に入れておくといいです
- **TestFlightで配布するには、App Storeを選択してProfileを作成する必要があります。**私は最初どれを選択すればいいか分からず混乱しました。なので、App Store配布もTestFlight配布も同様のProfileになります。

![スクリーンショット 2020-08-27 17.52.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170348/d74a74ee-a28b-8af6-2d08-a160d03d7660.png)

参考: [[iPhone] Provisioning Profile を作ってみる](https://i-app-tec.com/ios/provisioning-profile.html)

##4. App Store Connectで開発者や内部テスト参加者などを登録する
App Store Connectの[ユーザーとアクセス](https://appstoreconnect.apple.com/access/users)からメールアドレスでチームに人を追加します。
以下の役割をチームに追加する人に割り当てることができます。

- Admin
- Finance
- App Manager
- Developer
- Marketing
- Sales
- Customer Support

Account Holderが開発者に対してDeveloper権限を付与することがとりあえず大切です。

##5. （他の）開発者に必要なファイルを渡す
[3. Apple Developerで手続きをする](#3-apple-developerで手続きをする)で作成した以下のファイルとIDを共有しましょう。

- 開発用と配布用のそれぞれのiOS Certificate
- iOS App IDs
- 開発用と配布用のそれぞれのProvisoning Profile
- p12

p12については今まで触れていませんが、iOS Certificateに付与されている秘密鍵のことです。
[【iOS】複雑な証明書周りをあっさり整理してみた](https://shigu493.com/%E3%80%90ios%E3%80%91%E8%A4%87%E9%9B%91%E3%81%AA%E8%A8%BC%E6%98%8E%E6%9B%B8%E5%91%A8%E3%82%8A%E3%82%92%E3%81%82%E3%81%A3%E3%81%95%E3%82%8A%E6%95%B4%E7%90%86/)ではこのように説明されています。
>Certificateを作成したあと、ディベロッパーセンターからダウンロードしてダブルクリックすると、
Macのキーチェーンアクセスに自分の作成した証明書とそれに紐づく秘密鍵が表示されます。
秘密鍵を右クリックして書き出すと、「.p12」という拡張子のファイルが作成されます。

また、ダウンロードできるのはAccount Holderに限られるそうです。
>p12はダウンロードができないため、
最初にCertificateを作成してダウンロードした人がキーチェーンアクセスから書き出しておく必要があります。
他の人がCeritficateをダウンロードしてダブルクリックしてインストールしても、
鍵がついていない状態の証明書 しかインストールすることができません。


これで開発者がやっと開発できるようになります。
ここまでAcount Holderの方がやってくれれば、以降は開発者がやることです。

##6. Xcodeでの手続き
[[iPhone] アプリ申請のためXcodeでアップロードする](https://i-app-tec.com/ios/app-upload.html)を元に進めてください。

- 開発を始める前に、Apple Developerで手続きをした証明書や情報を整備する必要があります。
- ```Targets``` > ```Signing&Capabilities```で開発用のProvisioning Profileを選択しましょう
- 開発者は絶対に[5. App Store Connectで開発者や内部テスト参加者などを登録する](#5-app-store-connectで開発者や内部テスト参加者などを登録する)にあるようにAccount HolderにDeveloper登録を済ましてもらいましょう。これしないとビルドが通りません。

##7. Xcodeでゴリゴリ開発する
煩雑な環境整備を追えたら、あとは思う存分開発しましょう。

##8. XcodeでTestFlightへアップロードする
[[iPhone] アプリ申請のためXcodeでアップロードする](https://i-app-tec.com/ios/app-upload.html)の後半以降の流れで進めます。
補足すると、

- ```Product``` > ```Archive```でビルドする場合は配布用のProvisoning Profileですることに注意します。```Targets``` > ```Signing&Capabilities```のProvisioning Profileで変更できます。
- Select a method of distributionはApp Store Connectを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170348/faccaded-770d-f6a6-9ef3-ba51ad2409eb.png)
- Select a destinationはUploadを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170348/aa16ae92-493c-de99-34fd-6f50fd32b9a6.png)
- 何も設定しないと、Uploadしても自動的に TestFlightで配信されません。``` 輸出コンプライアンスがありません```とApp Store Connectで表示される為。[TestFlightで「輸出コンプライアンスがありません」を表示されないようにする方法](https://tommy10344.hatenablog.com/entry/2020/04/29/025809)を参考にします。