Flutterで作ったアプリをfastlane+App Distributionで配信する（iOS編）

開発以外のメンバーに実機テストをしてもらう場合にTestFlightだけで配信してたけど、流石に面倒なのと、ステージング環境用にビルドしたアプリを本番用とは別アプリとして配信したいので、[App Distribution](https://firebase.google.com/products/app-distribution/?hl=ja)で配信することにした。
ひとまずローカル環境でfastlaneを使ってApp Distributionに配信できるようにしたので、備忘録。

#1.環境を分けてビルド
基本的には@mono0926さんの記事で大体できるはず。とても丁寧に書かれていて、ありがとうございます。
[Flutterで環境ごとにビルド設定を切り替える — iOS編](https://medium.com/flutter-jp/flavor-b952f2d05b5d)

1個注意点として、ステージング用に別アプリにする場合、Identifiersをそれ用に用意しないといけない。
例えば、`com.test.app`が本番用だとして、`com.test.app.stg`みたいなIdentifiersをAppleDeveloperで作成しておく必要がある。普段iOS開発してると当たり前かもだけど、そうじゃないと忘れがち。

#2.fastlaneのインストール
fastlane周りの設定を行う。

```bash

$ sudo gem install fastlane -NV
```

gemでインストールしようとしたところ、`Failed to build gem native extension.`のエラーが出てインストールできなかった。色々調べて、行ったことは以下。

- `$ xcode-select --install`
- [AppleDevelopers](https://developer.apple.com/download/more/)からCommand Line Toolsをダウンロード（バージョンはmacOS_10.14_for_Xcode_10.3）してインストール
- `$ open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg`
- rbenvでRubyのバージョンを更新（2.3.0 -> 2.6.5）

こんな感じでなんとかfastlaneのインストールと実行ができるようになった。


#3.Fastfileを作る
Flutterの[公式ドキュメント](https://flutter.dev/docs/deployment/cd)を参考にしつつ、fastlaneの設定をする。

```bash

$ flutter build ios --release --flavor staging --target lib/main_staging.dart
$ cd ios
$ fastlane init
```
`fastlane/Fastfile`と`fastlane/Appfile`ができるので、Appfileの`app_identifier`や`team_id`、`apple_id`を確認する。
TestFlightにアップしたい場合は`FASTLANE_PASSWORD`の環境変数にiTunesConnectのパスワードを設定しておく。

iOS側のFastfileはこんな感じ。今回はステージング環境用のビルドなのでschemeはStagingを指定している。

```ruby

fastlane_version "2.28.3"

default_platform :ios

platform :ios do

  desc "Submit a new Staging Build to Firebase AppDistribution"
  lane :staging do
    gym(
      scheme: "Staging",
      export_options: {
        method: "ad-hoc"
      }
    )

  end

end
```

これで下記のコマンドでipaファイルを出力できるようになる。

```
$ fastlane staging
```

##4.Firebase App Distributionにアップする
ipaは作れるようになったので、次はApp Distributionにアップできるようにしていく。
まずはプラグインの追加。Gemfileを作るか聞かれるので、yと答えておく。

```
$ fastlane add_plugin firebase_app_distribution
[✔] 🚀 
[17:42:46]: Get started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile
[17:42:47]: Plugin 'fastlane-plugin-firebase_app_distribution' was added to './fastlane/Pluginfile'
[17:42:47]: It looks like fastlane plugins are not yet set up for this project.
[17:42:47]: fastlane will create a new Gemfile at path 'Gemfile'
[17:42:47]: This change is necessary for fastlane plugins to work
[17:42:47]: Should fastlane modify the Gemfile at path 'Gemfile' for you? (y/n)
y
[17:43:00]: Successfully modified 'Gemfile'
[17:43:00]: Make sure to commit your Gemfile, Gemfile.lock and Pluginfile to version control
Installing plugin dependencies...
Successfully installed plugins
```

これで、`Gemfile`と`Gemfile.lock`、`fastlane/Pluginfile`が作成される。あとはFastfileにfirebase_app_distributionのアクションを追加する。

```diff


fastlane_version "2.28.3"

default_platform :ios

platform :ios do

  desc "Submit a new Staging Build to Firebase App Distribution"
  lane :staging do
    gym(
      scheme: "Staging",
      export_options: {
        method: "ad-hoc"
      }
    )
+    firebase_app_distribution(
+      app: "（Firebase上のアプリ ID）",
+      groups: "dev",
+      release_notes: "from fastlane",
+      firebase_cli_path: `which firebase`.strip()
+    )

  end

end
```

`app`にはFirebaseのアプリIDを指定する。Settingsから確認することができる。
`groups`はApp Distributionでのテスターのグループを指定する。
あとは、firebase_app_distributionの実行にfirebase-toolsのバージョン7.4.0以上が必要なので、インストールする。今回はローカルからのアップなので、Firebaseへのログインもしておく。

```
$ npm install -g firebase-tools
$ firebase login
```

`firebase login`するとブラウザでログイン画面が開かれるので、アカウントを選んでログインする。ちなみにCI等で実行する場合は`firebase login:ci`で取得したトークンを`FIREBASE_TOKEN`の環境変数に設定すると良いらしい。

以上で準備は整ったので、fastlaneを実行する。Gemfileを作ったので、`bundle exec`から起動する。

```
$ bundle exec fastlane staging
```

##おわり
以上でApp Distributionでアプリが配信されるようになる。
今回はローカルでやったので、署名周りをflutter側で行ったけど、この辺りもfastlaneに任せてGithub ActionsでCDできるようにしたいところ。

##参考記事
- https://medium.com/flutter-jp/flavor-b952f2d05b5d
- https://qiita.com/skycat_me/items/0a0f5e3982fbfca14444
- https://qiita.com/fuwamaki/items/a9745e1242e24430eb4c#fastlane%E3%82%92%E7%94%A8%E3%81%84%E3%81%9Ffirebase-app-distribution%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E6%96%B9%E6%B3%95
- https://note.com/watura/n/nf49c04e54d09
- https://kouki.hatenadiary.com/entry/2019/10/02/094358