【Mac不要】開発中のFlutter製アプリを仲間のiOS端末に実機配備する手順 - Codemagic&TestFlight編

# はじめに

※この記事は、以下の記事の続編の一つです。

[【Mac不要】開発中のFlutter製アプリをiOSとAndroidに実機配備する手順 - Codemagic編](https://qiita.com/kami_teru/items/c7ed113d0ecdf7e48ff0)

Macなし、Windows機のみという環境でも、Flutterはクロスプラットフォーム対応ですので、作成したアプリはiOSにもリリースすることができることは上記の記事で紹介しました。

ただ、上記の記事では「開発者自身が所有するiOS端末に」という前提があります。しかし、開発は複数人のチームで行うことも多いと思います。

そこでこの記事では、上記の記事の手順を少し変更して、仲間（＝開発チームメンバー）のiOS端末にリリースする手順を紹介します。

## 前提

この記事は、以下に当てはまる人向けの iOS 対応アプリを開発する手順を紹介します。

* 開発機はWindowsだ
* **Macを持っていない**
* Flutterで開発したい
* Apple Developer Programに既に登録している、または年間で約12,000円を支払えるクレジットカードまたはデビットカードを持っていて、支払い後に最大48時間待ってやるのも悪くない。※1
* **複数人で開発するので、仲間のiOS端末にもアプリを配備したい**

※1: 2020/03/25現在。

## 開発環境の前提

以下の記事の手順に沿って、FlutterアプリをCodemagicでビルドし、自身のiOS端末にアプリを配備できる状態にしておいてください。※Androidに関する部分は飛ばして構いません。
* [【Mac不要】開発中のFlutter製アプリをiOSとAndroidに実機配備する手順 - Codemagic編](https://qiita.com/kami_teru/items/c7ed113d0ecdf7e48ff0)


## ソースコードの公開

この記事の手順で作成したソースコードはGithubで公開しています。併せてご参照ください。
https://github.com/atsuteru/flutter_firebase_0507/tree/Qiita-FlutterTestFlight-v1.0


# 本文

ここまでの手順では、iOSアプリは、以下の設定により「Development」としてApple Developer Programに登録した状態になっています。
![App settings - Google Chrome 2020_05_10 12_32_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/de0219f6-3417-54ae-6539-90e12b3d72eb.png)

なのでApple Developer Program側には、以下のようにアプリが（自動的に）登録されています。
自身のアカウントから [Certificates, Identifiers & Profiles - Profiles](https://developer.apple.com/account/resources/profiles/list)を開くと登録済みの一覧を見ることができます。その中、以下の登録ができていると思います。
![App settings - Google Chrome 2020_05_10 12_37_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/3c0d8cb2-f5dc-9429-bb94-9b9f9b795e9e.png)

ここでポイントは、以下の部分。

* Type が Development になっている
* Devices が 1 Totals になっている

なので、自身が登録した端末にしか配備できない、というわけです。
※「ならば仲間の端末もこのアカウントに登録したらいいじゃん♪」と思われるかもしれませんが、Apple Developer Programのアカウントに登録できる端末は、「自身が所有する」端末なので、やってはいけません。

iOSの場合、自身が所有する以外の端末にも配備するためには、以下の作業が必要です。

* アプリを Type=App Store として署名する
* 署名されたアプリを App Store Connectの自身のアカウントに登録する（自動的にできます）
* App Store Connectの自身のアカウントに、仲間を「内部テスター」として登録する。
* 仲間は、端末にAppleが提供するiOSアプリ`TestFlight`をインストールしておく
* App Store Connectの自身のアカウントから、仲間に対してテストしてほしいアプリを通知する。

ではさっそく、手順を進めていきましょう。

## ビルド側の設定変更

### Codemagicのビルド設定を App Store Connect 向けに変更する

#### Build

* Build arguments - iOS: `--build-number $BUILD_NUMBER`をそのまま貼り付けてください。
![App settings - Google Chrome 2020_05_10 13_30_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/f4d1dfe3-0ed2-7770-b4b0-d3ce821a3a54.png)

#### Publish

1) iOS code signing

* Provisioning profile type: ```App Store```に変更する<br/>
![App settings - Google Chrome 2020_05_10 12_54_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/32bc4ead-38de-8211-29b2-355e4c4e7460.png)

#### App Store Connect

* Enable App Store Connect publishing: チェックを付ける
* Apple ID: ご自身のApple Developer Programに登録しているApple ID(をメールアドレス)入力します。
* App-specific password: **認証用に取得した特別なパスワード**を設定します。詳細は下に。
* App ID: `iOS code signing`の`Bundle identifier`と同じものを入力しておきましょう

**認証用に取得した特別なパスワード**

[あなたのAppleIDの管理ページ](https://appleid.apple.com/account/manage)を開き、`セキュリティ`の段落にある`App用パスワード`の項目で、パスワードを生成します。ラベルは自分が識別できれば、何でも構いません。するとパスワードが払い出されますので、それを入力します。

Codemagic側の設定は、以上です。

## App Store Connect側の設定

### App Store ConnectにAppを登録する

[App Store Connect](https://appstoreconnect.apple.com/)にアクセスしましょう。初めてアクセスされた場合は、アカウントを作成してください。(Apple Developer Programのアカウントが必要です)

アクセスしたら、新規Appを登録しましょう。
以下、登録内容のイメージです。
※私の都合でイメージのアプリ名が0503から0507に代わってしまいました。そこに深い意味はありません。

![App Store Connect - Google Chrome 2020_05_09 18_30_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/7fbecf17-95c6-6931-9268-81c4d4b79ca8.png)

特に気を付けるところは、バンドルIDの選択を間違えないことと、SKUに「Codemagicで入力した`App Store Connect`の`App ID`と同じものを入力」する点です。

### App Store Connectに仲間を「内部テスター」として登録する

次に、仲間を登録しましょう。
App Store Connectの[ユーザーとアクセス](https://appstoreconnect.apple.com/access/users)ページを開きます。

![App settings - Google Chrome 2020_05_10 13_11_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/a182a46a-a48b-4dc3-57f4-858fa9f1e3ff.png)

左側のリストから、`Developer`を選択し、仲間のApple IDを登録しましょう。※仲間はApple Developer Programのアカウントを持っている必要はありません。

登録すると、仲間のApple IDのメールアドレスに、次のような招待メールが届きます。
<img width="320" alt="unnamed.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/fd858a69-cb25-6069-dc6b-d3d876b5bdc5.jpeg">

`Accept invitation`をクリックしてもらい、仲間による「Apple IDアカウントでのApp Store Connectへのサインイン」「利用規約(英語)の承諾」を経て登録が完了し、私のイメージの絵の具で塗りつぶしたような行のような表示になります。

### App Store ConnectにAppを配備する (Codemagicでのビルドの実行)

ここで、Codemagicに戻り、`Start new Build`をクリックして、ビルドしましょう。
ビルドが成功すると、App Store ConnectにAppを配備されます。

App Store Connectの`MyApp`の`TestFlight`ページを開きましょう。
以下の`ビルド6`のように、ビルドが成功したバージョンが一覧に表示されると思います。
![App settings - Google Chrome 2020_05_10 13_56_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/957ffb1e-fb64-a1e6-d0c4-fb6acd970d9d.png)

一覧からそのビルドを選択してみましょう。以下のようなページが表示されると思います。
![App settings - Google Chrome 2020_05_10 13_56_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/73981c0a-a3eb-eb29-6188-0053ef58e974.png)

App Store Connectからの開発中のアプリをテスターに配付する場合でも、輸出コンプライアンスの提出が必要です。これは主に「暗号化の利用に対する申告」に対するもの。`輸出コンプライアンスの提出`のリンクをクリックすると、提出まで進めることができます。

記事[【Mac不要】開発中のFlutter製アプリをiOSとAndroidに実機配備する手順 - Codemagic編](https://qiita.com/kami_teru/items/c7ed113d0ecdf7e48ff0)の手順で作成したアプリは、暗号化を利用していないので、そのように申告して提出すればOKです。**また、アプリ自体に暗号化を使用していない申告を埋め込むことで、App Store Connect上の作業をスキップすることができます。この手順は後ほど。**

なお、あなたがもし暗号化(HTTPSの利用も暗号化！)を利用する実装を行っている場合は、正しく申告して提出しましょう。そのあたりは私は以下の記事が参考になりました。
参考: [iOSアプリ提出の輸出コンプライアンスで、通信にHTTPSを使っているだけの場合の解釈 - @osamu1203](https://qiita.com/osamu1203/items/35df25d93e9d12b11222) 

さて、提出を終えると、以下の`ビルド6`ような表示になります。

![App settings - Google Chrome 2020_05_10 14_11_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/ccca5a9d-659c-1b6d-7dfa-9b46fcb16a6d.png)

### App Store Connectユーザに仲間を登録する

ビルドのページでは、ビルドごとに、端末にアプリを配備できる仲間の管理ができます。

そこに、デフォルトで`App Store Connectユーザ`というグループが追加されていると思います。自分自身は、ここに属している形です。またグループは、「TestFlight Appを使用して、すべての利用可能なビルドをテストできる」特別な「内部テスター」のグループです。

ビルドごとに仲間を登録するのは~~面倒~~大変なので、仲間をこのグループに登録しちゃいましょう。左側のメニューから、`テスター&グループ`配下の`App Store Connectユーザ`ページを開きます。
![App settings - Google Chrome 2020_05_10 13_40_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/c120cd59-a6f2-76a7-7961-cf2e8ea9b633.png)

このページで、テスターとして、際に登録しておいた`Developer`である仲間を追加しましょう。すると、仲間のメールアドレスに、以下ような招待メールが送付されます。
<img width="320" alt="unnamed(2).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/275bd046-313d-0704-c622-9b26d20d2ff3.jpeg">

仲間は、このメールの`View in TestFlight`をタップすることで、アプリを端末にインストールできるようになります。また仲間が上記の操作を行い、インストールを行うことで、先ほどの絵の具で塗りつぶした行の表示にされます。

### テスターにテストを依頼する

以上で、テスターへのビルドの通知を送る設定は完了しています。次のビルド以降、TestFlightを端末にインストールしてくれた仲間には、新しいビルドが登録された旨の通知が届くようになります。

## アプリへの「暗号化を使用していない旨の申告」の埋め込み

さて、最後に、アプリへの「暗号化を使用していない旨の申告」の埋め込み方法の手順です。

Macを持っている人は、XCodeを利用して`App Uses Non-Exempt Encryption`の設定を行いますが、Macを持っていない我々は、ファイルに設定を直接追記します。

```text:iOS/Runner/Info.plist
    <key>ITSAppUsesNonExemptEncryption</key>
    <false/>
```

この修正をPushした以降のビルドでは、App Store Connect上で「輸出コンプライアンスがありません」とはならないので、仲間に対しては「PushするだけでTestFlightからのビルド通知が届く」環境を構築することができます。

# さいごに

iOSアプリの配付は、Appleのセキュリティに対する徹底した姿勢があり、開発中のベータ版といえども多くの手順が必要になります。しかしCodemagicを利用することで、署名に関する手順やApp Store Connectに連携する手順が自動化できるので、開発者はよりコンテンツ制作に集中できることでしょう。

この記事が一人でも多くのFlutter開発者の助けになれば、幸いです。