Flutterのmapbox_glでアプリがクラッシュする問題
Flutter向け非公式mapboxライブラリのmapbox_glを使って、iOSで地図を表示しようとするとアプリがクラッシュする問題について解決したのでメモです。
Androidの設定で困っている方はこちら。
TL; DR
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
︙
+ <key>NSLocationWhenInUseUsageDescription</key>
+ <string>Shows your location on the map and helps improve the map</string>
</dict>
</plist>
前提と状況
- Flutter SDK 2.12.0
- mapbox_gl 未リリース版 (commit:
f90d54
) [1] - iOS 14.5 (Simulator)
Flutterのデバッグログには何も表示されず、ただコネクションがロストしていて、Simulatorのシステムログを見ても SIGABRT
で落ちているということしかわかりません。
com.apple.CoreSimulator.SimDevice.F631AA84-64DE-452F-A732-506E538347CB[9006] (UIKitApplication:com.example.MyApp[ce87][rb-legacy][42004]): Service exited due to SIGABRT
調査
example を動かしたら動いたので、新しく作ったミニマルなプロジェクトとファイル差分を取りながら何が足りないのかいろいろ試しました。
その結果 info.plist
が原因で、exampleで追加されていたのは以下の5つの項目でした。
<key>io.flutter.embedded_views_preview</key>
<true/>
<key>MGLMapboxAccessToken</key>
<string>YOUR_KEY_HERE</string>
<key>MGLMapboxMetricsEnabledSettingShownInApp</key>
<true/>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Shows your location on the map and helps improve the map</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Shows your location on the map and helps improve the map</string>
さらに絞っていくと、NSLocationWhenInUseUsageDescription
さえあれば動くこともわかりました。
愚痴
さすがにドキュメントに書いてあるやろと思って、探してみたらNSLocationWhenInUseUsageDescriptionについての記述はあったのですが、
To enable location features in an iOS application:
If you access your users' location, you should also add the following key toios/Runner/Info.plist
って、必須じゃないみたいな言い方じゃないですか?
恥ずかしながらこんなことで数日溶かして、Google Mapで実装しようかなと諦めかけたりもしましたが、解決できてうれしいです😠
-
nullable対応版がまだリリースされていないので、
dependency_overrides
でmasterブランチを使っています ↩︎
Discussion