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