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

by dicekest,

動機

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 もアップデートする必要があり結果全部あげる必要があったので結果以下のようなバージョンとなりました。

  # 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