Flutter v2.10.5からv3.7.0へバージョンアップした際に対応したこと
株式会社キャリースルー代表兼エンジニアの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
の依存は残していました。
Allow Non-modular includes in Framework Modules
をYes
にすることで解消しました。
これでひとまず、ローカル環境でアプリケーションを起動することができるようになりました。
バージョンアップできるライブラリはアップする
ライブラリもコードの変更がほとんどなくバージョンをあげられるところまでは上げようと思いました。
どうせすべての動作を確認するので、この機会にあげておこうと思い。
Scriptで使われているfirebase_crashlytics
は依存は残していたのでまずはこれを上げることにしました。
すると以下のエラーが出ました。
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'
というエラーが出ました。
以下を参考に、
// 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'
以下を参考に、
最終的に以下のようにすることでエラーが解消されました。// 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