#記事一覧
Swift MkMapViewで地図アプリ作成してみた(記事一覧)
#CLLocationManagerで現在位置を取得する
-
CLLocationManagerのdelegateを登録する
ViewController.swift:CoreLocationをimportするimport UIKit import MapKit import CoreLocation
ViewController.swift:CLLocationManagerDelegateを継承するclass ViewController: UIViewController, CLLocationManagerDelegate {
ViewController.swift:CLLocationManagerのメンバ変数を定義する@IBOutlet var mapView: MKMapView! var locManager: CLLocationManager!
ViewController.swift:delegateを登録するoverride func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. locManager = CLLocationManager() locManager.delegate = self
-
現在位置更新を受信する
ViewController.swift:現在位置更新を受信するfunc locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) { let lonStr = (locations.last?.coordinate.longitude.description)! let latStr = (locations.last?.coordinate.latitude.description)! print("lon : " + lonStr) print("lat : " + latStr) }
func locationManager(_ manager: CLLocationManager, ・・・はdelegate設定すると位置が変化する度に上記の関数がCallされるオーバーライドみたいな仕組み。
の、はずだがこのままではCallされない。
デバッグ実行してもbreakしない。
-
そのため、位置情報の使用の許可を得る
Info.plistで"Privacy - Location When In Use Usage Description"を追加し、Valueにデバイスに許可を得る際に表示する任意の文字列を入力する。
位置情報の使用の許可を求め、許可されればCLLocationManagerの現在位置更新を開始する。
ViewController.swift:位置情報の使用の許可を得るoverride func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. locManager = CLLocationManager() locManager.delegate = self // 位置情報の使用の許可を得る locManager.requestWhenInUseAuthorization() if CLLocationManager.locationServicesEnabled() { switch CLLocationManager.authorizationStatus() { case .authorizedWhenInUse: // 座標の表示 locManager.startUpdatingLocation() break default: break } }
locManager.requestWhenInUseAuthorization()により下記のDialogが表示されるため、Allowを押す。
すると現在位置が更新される度にlocationManagerがCallされる様になる。
一度Allowを選択するともうDialogが表示されることはない。