Flutterでアプリをリリースする

# はじめに
備忘録として、アプリをリリースする作業手順を記事にします。
AppleDeveloperProgramに登録してという段階からではなく、


# 共通手順
最初に共通手順として、以下を行いましょう。
失敗しないためのチェック項目です。
- 対象のプロジェクトを開き、ターミナルで`git status`
branchがビルド対象か確かめましょう
- `.env`など環境設定ファイルがあれば見直し
リリース用の環境に合わせて設定ファイルを見直します
- `pubspec.yaml`のバージョンをリリースするバージョンに更新 

# iOS
## コードをビルドする
対象のプロジェクトのコードをビルドしましょう。
```
flutter build ios
```

もしdart-definesを使って環境を切り替えている場合は、引数の指定もリリース用の引数か確認しましょう。

## Archiveする
iosフォルダにあるRunner.xcodeprojをXcodeで開きます。
VSCodeの場合はiosフォルダを右クリック、Open in xcodeで開けます。
開いたら、上の対象機器をAny iOS Device (arm64)に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/65e03526-da6f-cac8-cd9b-6d409859da6d.png)

XCode14.3だとエラーになることがありますがその場合は下記で解決できました。

https://qiita.com/kokogento/items/fb4f62393ae1e3a76b06

Archive後は下記の画面が表示されるので、ビルドしたバージョンのArchiveをDistribute Appします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/6f64ec9d-37a8-3d65-5c46-469f2130fec9.png)

そのあといくつかダイアログが現れますが特に何も変更せずにそのまま次へで進んでいきます。

すると、アップロード画面が現れるのでアップロードし、完了するまで待ちます。
完了すると、AppStoreConnectの方から見れるようになります。

### TestFlight

前項でアップロードしたアプリはTestFlightで確認できるので最終動作確認しましょう。
アップロード後すぐには利用できないので、10分くらい待つと「輸出管理の変更」ができるようになります

輸出管理は特にアルゴリズムを使ってなかったら使ってないでOKです

### リリース
AppStore Connectのアプリのページに行くと、左側



# Android
https://gakogako.com/flutter_android_release/#keystore%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B

手順としては以下になります
- ビルドに署名するためのkeystoreファイルを作成
- ビルドするためにプロジェクト設定
- ビルド
- GooglePlayStoreでアップロード
- 審査して、リリース

## keystoreファイルの作成
```
keytool -genkey -v -keystore ./key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key
```

ファイルを作りたいディレクトリで、上記のコマンドを実行してください。
実行するとパスワードを入力してくださいと言われますので、任意のパスワードを入力してください。
（他の工程でも使うので、パスワードは覚えておいてください）
入力すると、もう一度パスワードを求められますので同じのを入力してください
あとは順番に情報を入力していきます。

必要な情報をまとめると下記になります。
- パスワード
- 姓名
- 組織単位名
- 組織名
- 都市名または地域名
- 都道府県名または州名
- 国コード

最後に以下を聞かれますが、そのままでいいと思いますのでEnterを押してください
```
<key>のキー・パスワードを入力してください
	(キーストアのパスワードと同じ場合はRETURNを押してください):  
[./key.jksを格納中]
```

また下記のワーニングが表示されることがありますが、よく調べてないです。
一旦、無視しました。
```
Warning:
JKSキーストアは独自の形式を使用しています。"keytool
 -importkeystore -srckeystore ./key.jks -destkeystore ./key.jks -deststoretype pkcs12"を使用する業界標準の形式であるPKCS12に移行することをお薦めします。
```

## プロジェクトの設定をする
リリースビルド用にプロジェクトを設定します。

### keystoreファイルを配置する
先ほど作成したkeystoreファイルをビルドするプロジェクトの`android/app`下におきます。

### key.propertiesファイルを作成する
`android`下に、`key.properties`というファイルを作成します。
ビルドする際にkeystoreファイルを使うための設定情報のようなものだと思います。
```
storePassword=keystoreファイル作成時のパスワード
keyPassword=keystoreファイル作成時のパスワード
keyAlias=key
storeFile=./key.jks
```

### build.gradleの編集
リリースビルド用に編集します

`android/app/build.gradle`

```
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

// 追加
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

// ーーーーーー省略ーーーー

defaultConfig {
// ・・・・      
}

// 追加
signingConfigs {
    release {
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
        storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
        storePassword keystoreProperties['storePassword']
    }
}

// 編集
buildTypes {
    release {
        // TODO: Add your own signing config for the release build.
        // Signing with the debug keys for now, so `flutter run --release` works.
        // ※debugからreleaseに変える
        signingConfig signingConfigs.release
    }
}
```

### パッケージ名変更

`android/app/src/main/AndroidManifest.xml`を確認し、パッケージ名がデフォルトのcom.exampleを使っているなら変更しましょう。
以下の部分です。
```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxx.xxxxxx">
```

パッケージ名の変更方法は[こちらの記事](https://qiita.com/osamu1203/items/6adfab47e562f5e7d03b)がわかりやすかったです。

パッケージ名が最初に決まっているなら、作成の段階で指定すると楽です。

```
flutter create --org com.hoge --project-name
```

[参考記事](https://qiita.com/kurun_pan/items/f9251b1827ce9dca9e14#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E4%BD%9C%E6%88%90)

## ビルドする
いよいよビルドしますが、その前に、もう一度、ブランチと環境設定ファイルの確認をしましょう。
問題なければ次のコマンドを実行してください。

```
flutter clean
```


```
flutter build appbundle
```

（dart-defineで環境を切り替えている場合は、引数の指定もリリース用になっているか確認してください。flutter build appbundle --dart-define-from-file=dart_defines/xxxx.json)