[iPhone] 現在地をMapKitで地図表示する

例えばお店の位置を知らせる地図は緯度経度からすぐにできますが、自分が今どこにいるのか知りたいという場合には、ユーザー許可を取得したりして少し手間がかかります。


Swift 5.1
Xcode 11.3.1

requestWhenInUseAuthorization

ある決まった場所を地図で紹介するときは緯度経度が確定しているので簡単にできました。

iOSには地図を表示するために MapView が用意されています。Swift で簡単に地図が作れるのでやってみましょう。

では、ユーザーが今いるところが知りたいケースではどうするのでしょうか。

ユーザー許可のリクエスト
位置情報は(少なくとも日本では)個人情報保護の観点から、ユーザー許可を取る必要がでてきます。
NSLocationWhenInUseUsageDescription をKeyとして、説明をInfo.plistに書き込みます。これは位置情報を取得するときのユーザーへの説明です。こっそり裏で位置情報を取ることはできません(審査で落ちるでしょう)

Info.plist


これを呼び出すためのコードは


notDeterminedのステータスが返ってきたら
requestWhenInUseAuthorization()
を投げて許可を求めるダイアログを表示させます。

カレンダーアプリなのに位置情報を取得しようとするとユーザーが疑問を持ちますので、アプリのこういった機能のためであるなど、理由を説明することができます。



userLocation.coordinate
固定の緯度経度を設定したCLLocationCoordinate2Dの代わりに、現在位置はこれを使って取得できます。
また、ユーザーが移動して位置が変わった時も追従するように設定。
startUpdatingLocation()

常に追従させていく方法として、トラッキングモードも設定できます。
MKUserTrackingMode.follow
MKUserTrackingMode.followWithHeading

NativeのMapsアプリではSafeAreaを考慮して実装してありました(あたりまえ!)
それを参考に、Portraitではtopとbottomには地図を表示させないようにしました。

ちなみに、Mapsではtopは薄く透明にしてbottomはSearchバーを置いています。

サンプルコード

位置情報は今では個人情報ですが以前はなあなあだった時もあります。

Simulatorでテストするとエラーになります。


これは実際の位置情報が重要だということでしょう、実機で試せば大丈夫です。

 

ViewController.swift




References:
MKMapView — MapKit | Apple Developer Documentation
MKUserTrackingMode — MapKit | Apple Developer Documentation