😽

Flutter v2.10.5からv3.7.0へバージョンアップした際に対応したこと

2025/02/17に公開

株式会社キャリースルー代表兼エンジニアのHide(ひで)です。
先日HOUSEダンサーTAIKIさん(https://www.youtube.com/@taikihousedance) 専用の、レッスン予約アプリの開発を前任の方から弊社で引き継ぎました。

アプリは2022年3月6日を最後にアップデートされておらず、かなり環境が古い状態でした。
ローカル環境でビルドしようとするとエラーが大量に出てしまい、修正しては新たなエラーが出るの繰り返しになっていました。最終的に調べてもわからないようなエラーも発生し、これならいっそFlutterを最新に近いバージョンまで上げてしまったほうが早いだろう、という結論に至りました。
画面数、機能数も少なく動作確認もそこまで大変ではなかったので。

以下では、Flutterのバージョンを引き上げ、アプリのリリースにこぎ着けるまでに行った対応をまとめます。

エラーを解消しきれないのでFlutterのバージョンを上げることに

当初はFlutter v2.10.5のままどうにかエラーを直そうとしていました。

flutter --version
Flutter 2.10.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 5464c5bac7 (2 years, 10 months ago) • 2022-04-18 09:55:37 -0700
Engine • revision 57d3bac3dd
Tools • Dart 2.16.2 • DevTools 2.9.2

手元のXcodeのバージョンは16.2でした。

出たエラーをいくつか抜粋すると、

clang++: error: SDK does not contain 'libarclite' at the path
    '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a'; try increasing the minimum deployment
    target
    Command Ld failed with a nonzero exit code
 clang: error: unsupported option '-G' for target 'arm64-apple-ios8.0-simulator'
clang++: error: SDK does not contain 'libarclite' at the path '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a'
ABSL_CONST_INIT extern "C" const int64_t kFIRFirestoreCacheSizeUnlimited =

^~~~~~~~~~~~~~~

error: an attribute list cannot appear here

などのエラーが発生していました、

Flutterのバージョンを3.7.0まで上げることしました。
Flutterのバージョンを3.0系->3.3系->3.7系と上げてローカル環境で起動時のエラー解消が容易になるまで試した結果v3.7.0に落ち着きました。

このとき、dependenciesなライブラリはほぼ無くしてただ画面に文字が表示されるだけの状態でバージョン上げの検証をしました。
バージョンアップ後に再度ライブラリを戻しつつ、必要に応じてバージョンを上げていく方針です。

Flutterのバージョンを3.7.0にして、出たエラーは以下でした。

error: include of non-modular header inside framework module 'firebase_crashlytics.Crashlytics_Platform':
'/Users/hide/hid3h/taiki_super_app/ios/Pods/Headers/Public/Firebase/Firebase.h'

Scriptで使われているfirebase_crashlyticsの依存は残していました。

https://github.com/firebase/flutterfire/issues/12962
上記を参考に、下記の画像のAllow Non-modular includes in Framework Modules Yesにすることで解消しました。

これでひとまず、ローカル環境でアプリケーションを起動することができるようになりました。

バージョンアップできるライブラリはアップする

ライブラリもコードの変更がほとんどなくバージョンをあげられるところまでは上げようと思いました。
どうせすべての動作を確認するので、この機会にあげておこうと思い。

Scriptで使われているfirebase_crashlyticsは依存は残していたのでまずはこれを上げることにしました。

https://pub.dev/packages/firebase_crashlytics/versions
上記を見るとv4.0.1, v4.0.2がMin Dart SDKが2.18で対応しているので試してみました。
すると以下のエラーが出ました。

The current Dart SDK version is 2.19.0.

Because firebase_crashlytics >=4.0.1 <4.0.2 depends on firebase_core ^3.1.0 and firebase_crashlytics >=4.0.0 <4.0.1 depends on firebase_core ^3.0.0, firebase_crashlytics >=4.0.0 <4.0.2 requires firebase_core ^3.0.0.
And because firebase_core >=3.0.0 <3.1.0 depends on firebase_core_web ^2.17.1, firebase_crashlytics >=4.0.0 <4.0.2 requires firebase_core_web ^2.17.1 or firebase_core ^3.1.0.
And because firebase_crashlytics >=4.0.3 requires SDK version >=3.2.0 <4.0.0 and firebase_crashlytics >=4.0.2 <4.0.3 depends on firebase_core ^3.1.1, firebase_crashlytics >=4.0.0 requires firebase_core_web ^2.17.1 or firebase_core ^3.1.0.
And because firebase_core >=3.2.0 requires SDK version >=3.2.0 <4.0.0 and firebase_core >=3.1.0 <3.2.0 depends on firebase_core_web ^2.17.2, firebase_crashlytics >=4.0.0 requires firebase_core_web ^2.17.1.
So, because firebase_core_web >=2.11.0 requires SDK version >=3.2.0 <4.0.0 and taiki_super_app depends on firebase_crashlytics ^4.0.0, version solving failed.

firebase_crashlyticsの依存を辿っていくとfirebase_core_webがDart3.2が必要ということでインストールできませんでした。

次に、firebase_crashlyticsのv3系を試すとインストールできました。
v3.4.9を入れることができました。

後は、画面単位でライブラリをまとめてバージョンアップしていきました。
一時的に外していたdependenciesなライブラリを元に戻しつつバージョンを上げられるところは上げていきました。
すべて詳細に書くと冗長になるので、かいつまんで書いていきます。

firebase_storage

firebase_crashlyticsによりFirebase iOS SDKのバージョンが10系が入ってるため同じく10系となるようにfirebase_storageを9系から11系にアップしようとしました。
すると

error: value of optional type '(any StorageProvider)?' must be unwrapped to refer to member 'storage'

というエラーが出ました。
以下を参考に、
https://github.com/firebase/flutterfire/issues/12429

// ios/Podfile
target 'Runner' do
  use_frameworks!
  use_modular_headers!

  # https://github.com/firebase/flutterfire/issues/12429
  # このエラー解決のために追加
  #
  $FirebaseSDKVersion = '10.22.0'

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

を追加することでエラーを解消。

また、以下のエラー(warningですが起動できない)も出ました。

 /Users/hide/hid3h/taiki_super_app/ios/Pods/Pods.xcodeproj: warning: The iOS Simulator deployment target
    'IPHONEOS_DEPLOYMENT_TARGET' is set to 9.0, but the range of supported deployment target versions is 12.0 to 18.2.99. (in target
    'abseil' from project 'Pods')

以下の部分を追加することで解消。

// ios/Podfile
post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    # 以下を追加
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
    end
  end
end

するとまた別のエラーが出ました。

clang: error: unsupported option '-G' for target 'arm64-apple-ios12.0-simulator'

以下を参考に、
https://stackoverflow.com/questions/78608693/boringssl-grpc-unsupported-option-g-for-target-arm64-apple-ios15-0/78633109#78633109
最終的に以下のようにすることでエラーが解消されました。

// ios/Podfile
post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == 'BoringSSL-GRPC'
      target.source_build_phase.files.each do |file|
        if file.settings && file.settings['COMPILER_FLAGS']
          flags = file.settings['COMPILER_FLAGS'].split
          flags.reject! { |flag| flag == '-GCC_WARN_INHIBIT_ALL_WARNINGS' }
          file.settings['COMPILER_FLAGS'] = flags.join(' ')
        end
      end
    end
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
    end
  end
end

image_picker

v0.8.4+1 -> v1.0.4にアップ
メソッド名が変更されたため、getImage() -> pickImage()に変更

firebase_rmote_config

v0.10.0+5 -> v4.3.8にアップ

final remoteConfig = RemoteConfig.instance;final remoteConfig = FirebaseRemoteConfig.instance;

に変更。

flutter_riverpod

今回はv0.12.4のまま据え置き。
1系に上げるにはコードの変更量が多かったため今回は見送り。

そのほか

Firebase iOS SDKが10系に合うように、Firebase系ライブラリをアップデート
それ以外のライブラリもDart SDKの制約範囲で上げられるものは上げました

リリース

ここまでで、ローカル環境でエラーなく起動できる状態になり、実機テストや動作確認も問題なしと判断。いよいよApp Store Connectにビルドをアップロードし、審査に出しました。

しかし、「写真ライブラリへのアクセス許可文言が不十分」 という理由でリジェクトされました。以前は問題なく通っていたのですが、Appleの審査ポリシーが変更されたり、より厳格になっていたりする可能性があります。利用用途をわかりやすく伝える文章を Info.plist で修正したところ、無事に審査通過し、リリースすることができました。

おわり

今後はちょくちょくアップデートしていきたい。。
少しでも参考になれば幸いです。

Discussion