💣

Flutterのmapbox_glでアプリがクラッシュする問題

2021/09/04に公開

Flutter向け非公式mapboxライブラリのmapbox_glを使って、iOSで地図を表示しようとするとアプリがクラッシュする問題について解決したのでメモです。

Androidの設定で困っている方はこちら

TL; DR

ios/Runner/info.plist
  <?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つの項目でした。

info.plist
<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 to ios/Runner/Info.plist

って、必須じゃないみたいな言い方じゃないですか?

恥ずかしながらこんなことで数日溶かして、Google Mapで実装しようかなと諦めかけたりもしましたが、解決できてうれしいです😠

脚注
  1. nullable対応版がまだリリースされていないので、dependency_overrides でmasterブランチを使っています ↩︎

GitHubで編集を提案

Discussion