Flutter 1.22とFirebaseプラグインをアップデートする iOS編

### 動機

Flutter 1.22でiOS14への対応が明言されたことと、`firebase_crashlytics`がFirebase Crashlytics SDKに対応されたのでアップデートできるものはアップデートしたい

### Xcode12のダウンロード

Xcode12が必要になるのでダウンロードしておきます
こちらから適当なXcodeをダウンロードできます

https://developer.apple.com/download/more/

```
[✓] Xcode - develop for iOS and macOS (Xcode 12.0.1)
```

### Flutterのアップデート

まずはFlutterをアップデートしていきます

```
$ flutter upgrade
```

アップデート時点では以下のバージョン

```
[✓] Flutter (Channel stable, 1.22.0, on Mac OS X 10.15.6 19G73, locale ja-JP)
```

### Podfileを作り直す

これはプロジェクトの作成時期によって対応が必要か分かれると思いますが、
古いバージョンのFlutterで作成されたPodfileの場合は一度削除して作り直したほうがいいです。
削除してflutter runすると新しいPodfileが作成されると思います。

プロジェクトによってはPodfileに設定を追加している場合があると思うので必要な修正を加えましょう。
Xcodeのビルド設定が複数ある場合の設定やFirebaseプラグインに関連した修正などがありそうです。

```
$ rm ios/Podfile
$ flutter run
```

### プラグインの更新

`firebase_crashlytics` を更新するためには`firebase_core` もアップデートする必要があり結果全部あげる必要があったので結果以下のようなバージョンとなりました。

```pubspec.yaml
  # Firebase
  firebase_core: 0.5.0
  firebase_auth: 0.18.1+1
  firebase_crashlytics: 0.2.1
  firebase_messaging: 7.0.2
  firebase_ml_vision: 0.9.7
  firebase_dynamic_links: 0.6.0+1
  firebase_analytics: 6.0.1
```

このまま普通にやってもXcodeのビルドにこけまくるので対応をします。
Firebaseのプラグインが古いまま残ってしまい新しいバージョンが
想定通りダウンロードされず依存解決に失敗するということが起きていたようです。
(この辺でかなり時間を費やしてしまったので実行順はかなり怪しいのと不要なコマンドもあるかもしれないです

```
$ flutter clean
$ cd ios && rm -rf Pods/
$ flutter packages upgrade
$ pod update && pod install
```

実際に起きたエラーは以下のようなものです。

```
    [!] CocoaPods could not find compatible versions for pod "Firebase/Core":
      In Podfile:
        firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) was resolved to 6.0.1, which depends on
          Firebase/Analytics (~> 6.26.0) was resolved to 6.26.0, which depends on
            Firebase/Core (= 6.26.0)
        firebase_ml_vision (from `.symlinks/plugins/firebase_ml_vision/ios`) was resolved to 0.1.1, which depends on
          Firebase/Core
    CocoaPods could not find compatible versions for pod "FirebaseCore":
      In Podfile:
        firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) was resolved to 6.0.1, which depends on
          Firebase/Analytics (~> 6.26.0) was resolved to 6.26.0, which depends on
            Firebase/Core (= 6.26.0) was resolved to 6.26.0, which depends on
              FirebaseAnalytics (= 6.6.0) was resolved to 6.6.0, which depends on
                FirebaseCore (~> 6.7)
        firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) was resolved to 6.0.1, which depends on
          Firebase/CoreOnly (~> 6.26.0) was resolved to 6.26.0, which depends on
            FirebaseCore (= 6.7.2)
        firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) was resolved to 0.2.1, which depends on
          Firebase/Crashlytics (~> 6.26.0) was resolved to 6.26.0, which depends on
            FirebaseCrashlytics (~> 4.1.1) was resolved to 4.1.1, which depends on
              FirebaseCore (~> 6.6)
        firebase_dynamic_links (from `.symlinks/plugins/firebase_dynamic_links/ios`) was resolved to 0.6.0-1, which depends on
          Firebase/DynamicLinks (~> 6.26.0) was resolved to 6.26.0, which depends on
            FirebaseDynamicLinks (~> 4.0.8) was resolved to 4.0.8, which depends on
              FirebaseCore (~> 6.2)
    CocoaPods could not find compatible versions for pod "GoogleUtilities/AppDelegateSwizzler":
      In Podfile:
        firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) was resolved to 6.0.1, which depends on
          Firebase/Analytics (~> 6.26.0) was resolved to 6.26.0, which depends on
            Firebase/Core (= 6.26.0) was resolved to 6.26.0, which depends on
              FirebaseAnalytics (= 6.6.0) was resolved to 6.6.0, which depends on
                GoogleUtilities/AppDelegateSwizzler (~> 6.0)
        firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) was resolved to 7.0.2, which depends on
          Firebase/Messaging (~> 6.26.0) was resolved to 6.26.0, which depends on
            FirebaseMessaging (~> 4.4.1) was resolved to 4.4.1, which depends on
              GoogleUtilities/AppDelegateSwizzler (~> 6.5)
          GoogleUtilities/AppDelegateSwizzler (~> 6.5.2)
    CocoaPods could not find compatible versions for pod "GoogleUtilities/Environment":
      In Podfile:
        firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) was resolved to 6.0.1, which depends on
          Firebase/Analytics (~> 6.26.0) was resolved to 6.26.0, which depends on
            Firebase/Core (= 6.26.0) was resolved to 6.26.0, which depends on
              FirebaseAnalytics (= 6.6.0) was resolved to 6.6.0, which depends on
                FirebaseInstallations (~> 1.3) was resolved to 1.4.0, which depends on
                  GoogleUtilities/Environment (~> 6.6)
        firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) was resolved to 6.0.1, which depends on
          Firebase/CoreOnly (~> 6.26.0) was resolved to 6.26.0, which depends on
            FirebaseCore (= 6.7.2) was resolved to 6.7.2, which depends on
```

さらにXcode12からはDeployment TargetからiOS8がドロップされたためビルド時に警告が大量に出力されてしまうのでライブラリのDeployment Targetを適宜変更します。

```
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
    end
  end
end
```

### 新しいWidgetとの競合

Flutter1.22から以下のボタンWidgetが追加されましたが、
すでにプロジェクトで`TextButton`というカスタムWidgetが存在していたため
リネームするなど必要な対応を行いました。

|新規Widget|新規Theme|
|---|---|
|TextButton|TextButtonTheme|
|ElevatedButton|ElevatedButtonTheme|
|OutlinedButton|OutlinedButtonTheme|

### flutter_stetho

アプリの通信系のデバッグツールとしてstethoを利用していますがこちらのプラグインがFlutter1.22に対応していないため対応している修正ブランチを取り込みます。
（PRがすでに出ているので取り込まれたら普通にアップデートすればいいです

https://github.com/brianegan/flutter_stetho/pull/40

```
  flutter_stetho:
    git:
      url: https://github.com/jasonlewicki/flutter_stetho
```

今回のアップデートがめちゃくちゃ時間かかってしまったのでやったことを整理しておきました。
これから対応する方の参考になれば嬉しいです。
さて、次はAndroidの対応するぞい！

### 参考

https://github.com/flutter/flutter/issues/28054
https://stackoverflow.com/questions/50768723/what-does-warning-mapping-architecture-arm64-to-x86-64-mean
https://qiita.com/taki4227/items/db9b503e56ab25a8a375
https://qiita.com/temoki/items/46ad22940e819a132435