MapKitで地図表示を実装してつまずいた話

MapKitで地図表示を実装してつまずいた話 トラブルシューティング

BGTaskSchedulerでのバックグラウンド更新を実装したあと、記録した場所を地図上で振り返れるようにしたくなり、MapKitでの地図表示に挑戦しました。

1. 古いUIKit時代の記法をそのまま使おうとした

検索して最初に見つかる情報の多くがMKMapViewをUIKitで組み込む古い記法で、SwiftUIプロジェクトにそのまま持ち込もうとして苦労しました。

Map(coordinateRegion: $region)

SwiftUIにはMapという専用のビューが用意されており、UIViewRepresentableでMKMapViewをラップしなくても地図を表示できました。情報を探すときは「SwiftUI Map」で検索し直すことで、シンプルな実装にたどり着けました。

2. 位置情報の許可リクエストのタイミングを誤っていた

アプリ起動直後、画面が表示される前のタイミングで位置情報の許可リクエストを出したところ、ユーザーが何の説明もなく許可ダイアログに驚いてしまう不具合がありました。

位置情報が必要な理由をユーザーが理解できるタイミング(地図画面を開こうとした瞬間など)でリクエストを出すように変更しました。唐突に許可を求めるのではなく、文脈に沿ったタイミングで求めることの大切さを実感しました。

3. Info.plistの権限説明文を一つしか用意していなかった

位置情報の権限には「使用中のみ許可」「常に許可」など複数の種類があるのですが、Info.plistに片方の説明文しか用意しておらず、審査時に指摘を受けそうになりました。

NSLocationWhenInUseUsageDescription
NSLocationAlwaysAndWhenInUseUsageDescription

使う権限の種類に応じて、それぞれ専用の説明文キーを用意する必要があると分かりました。今回のアプリでは「使用中のみ」で十分だったため、不要な常時許可の説明文は削除して整理しました。

4. 表示するピンの数が多いと地図が固まった

記録した場所すべてをピンとして表示したところ、件数が増えるにつれて地図のスクロールがカクつくようになりました。

すべてのピンを常に描画するのではなく、表示中の範囲に含まれるものだけを絞り込んで描画する、あるいは近接したピンをまとめて表示する(クラスタリング)といった工夫が必要だと学びました。今回はまず表示範囲での絞り込みだけを実装し、体感できるほど改善しました。

まとめ

  • SwiftUIでは専用のMapビューが使える。UIKit時代のMKMapViewの記法をそのまま持ち込む必要はない
  • 位置情報の許可リクエストは、ユーザーが理由を理解できる文脈のタイミングで出す
  • 権限の種類(使用中のみ/常に)に応じて、Info.plistの説明文キーを適切に使い分ける
  • ピンの数が多くなる場合は、表示範囲での絞り込みやクラスタリングを検討する

地図を表示するだけなら簡単そうに見えて、権限まわりとパフォーマンスの両方に配慮が必要な実装でした。

次は、共有機能(UIActivityViewController)を実装してみて分かったことをまとめます。


本記事は生成AI(Claude)を活用して執筆・編集しています。内容は実体験に基づき、執筆者本人が確認・監修しています。

コメント

タイトルとURLをコピーしました