今回の記事はSwiftでiOSアプリに地図を表示するMapKitを使って現在地を表示する方法に関する記事です。地図アプリで現在地を表示することはよくあると思います。MapKitを使って現在地を表示させたいと考えている方は是非参考にしてみてください。
XcodeにMapKitを追加
cocoapodでライブラリのインストールなどは行う必要はありません。まずは、既存のフレームワーク「MapKit.Framework」をXcodeプロジェクトに追加します。(下記図参照)

「+ボタン」を押すとXcode内に元々入っているフレームワークの一覧が表示されます。ここでMapなどで検索すれば「MapKit.Framework」が出てきますのでaddを押します。

これでMapKitがXcodeプロジェクトに追加されましたのでstoryboardでMapKitを使用していきます。

Xcodeの右上の「+ボタン」を押してMapKitViewをstoryboardに追加します。画面いっぱいに広げてみましょう。
MapKitで地図を表示
MapKitに地図を表示させるだけの場合は、特にソースコードでの実装は不要です。
この地図上で何か操作を行う場合のみソースコードでの実装が必要です。
この状態でアプリをbuildすると下記のように地図を表示できます。

では現在地を表示させていきます。
MapKitで現在地を表示する方法
上記までの流れで、地図を表示させるところまではできたと思います。では次に初期表示を現在地にしてみましょう。
「info.plist」に現在地取得の設定を追加
現在地を取得するためにはXcodeの「info.plist」に設定を追加する必要があります。
まずはXcodeプロジェクトのディレクトリの「info.plist」をクリックして見て下さい。

こちらをクリックするとたくさん表示がある一覧のページに飛びます。
その一覧の「infomation property list」の横の「+マーク」をクリックしてください。

すると選択欄が出てくるのでそちらで下記2項目を選んびます。

- Privacy – Location When In Use Usage Description
- Privacy – Location Always Usage Description
この設定項目の右横に文字を入力できます。こちらがアプリで現在地を取得して良いかという許可をユーザに表示させるものです。
とりあえずOKなど適当な文字を設定しましょう。
MapKitの設定
MapKitのViewにユーザの現在地を取得する設定をします。

これでXcode関連の設定は完了です。
現在地を表示させるソースコード実装
次にMapKitで現在地を表示させる方法です。CLLLocationManagerDelegateを地図を表示させる画面に紐ずくViewControllerのクラスに追加します。
import UIKit
import MapKit
import CoreLocation
class MapViewController: UIViewController,CLLocationManagerDelegate {
@IBOutlet weak var map: MKMapView!
var locationManager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager!.requestWhenInUseAuthorization()
}
// 許可を求めるためのdelegateメソッド
func locationManager(_ manager: CLLocationManager,didChangeAuthorization status: CLAuthorizationStatus) {
switch status {
// 許可されてない場合
case .notDetermined:
// 許可を求める
manager.requestWhenInUseAuthorization()
// 拒否されてる場合
case .restricted, .denied:
// 何もしない
break
// 許可されている場合
case .authorizedAlways, .authorizedWhenInUse:
// 現在地の取得を開始
manager.startUpdatingLocation()
break
default:
break
}
}
}
コードの解説を行います。
@IBOutlet weak var map: MKMapView!
MapKitのViewをIBOutletで紐付けます。
var locationManager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager!.requestWhenInUseAuthorization()
}
上記の部分でCLLocationManagerにユーザの現在地をセットします。「locationManager!.requestWhenInUseAuthorization()」で認証をしています。
日本全土表示させるようにしています。
まずは現在地を使用するためにCoreLocationをインポートします。
そしてlocationmanagerというものを定義してそちらで全ての管理をこなっていきます。
そして現在地取得のdelegateの関数を記載して後はページロード時に全て読み込みをお行えば完了です。
正直深くまでわからなくとも上記コードでうまくいきます。
ただ私が一瞬ハマった落とし穴がエミュレータではどうやらこちら現在地を取得できない様です。
そのため実機での検証が必要ですのでそれだけは忘れずにです。

では、今回の記事は以上です。他にも多数のSwift関連の記事を記載しているので是非参考にしてみてください。
コメント