※数年前に書いたこちらの記事が古くなってきたので、Swift編 として書き直しました。
CoreLocationを使って、緯度・経度を取得する方法をメモしておきます。
実行環境
- Xcode 8.0
- Swift 3.0
実装方法
準備
まずは「CoreLocation.framework」を追加します。
次に Info.plist の NSLocationWhenInUseUsageDescription
に 位置情報を使用する目的 を記載します。この内容はユーザに位置情報の使用を許可する際に表示されます。
実装
CoreLocation をインポートします。
import CoreLocation
CLLocationManagerDelegate プロトコルを宣言します。
class ViewController: UIViewController, CLLocationManagerDelegate {
ユーザが位置情報の使用を許可しているか確認します。許可状況は didChangeAuthorizationStatus
デリゲートで確認できます。初回は NotDetermined
ステータスが返るので、requestWhenInUseAuthorization()
メソッドでユーザに許可を求めます。
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { switch status { case .notDetermined: locationManager.requestWhenInUseAuthorization() case .restricted, .denied: break case .authorizedAlways, .authorizedWhenInUse: break } }
現在地の取得を開始します。
if CLLocationManager.locationServicesEnabled() { locationManager = CLLocationManager() locationManager.delegate = self locationManager.startUpdatingLocation() }
この状態で iPhone の位置情報が更新されると、次のデリゲートが呼ばれます。
// 位置情報が更新されるたびに呼ばれる func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { guard let newLocation = locations.last else { return } self.latTextField.text = "".appendingFormat("%.4f", newLocation.coordinate.latitude) self.lngTextField.text = "".appendingFormat("%.4f", newLocation.coordinate.longitude) }
現在地情報の取得を停止するには次のメソッドを実行します。
if CLLocationManager.locationServicesEnabled() {
locationManager.stopUpdatingLocation()
}
サンプルコード
- https://github.com/koogawa/iSensor/blob/master/iSensor/LocationViewController.m
- https://github.com/koogawa/iSensorSwift/blob/master/iSensorSwift/Controller/LocationViewController.swift
注意点
- シミュレータでテストする場合は、メニュー > Debug > Location から位置情報をカスタマイズできます
- 位置情報のアクセス権限について詳しく知りたい場合は下記の記事を参照してください