CoreLocationを用いて位置情報を取得する
最終更新日:2015-10-18
位置情報を取得するには、次の5ステップを行います。本記事はiOS 8以上でのみ動作します。iOS 7もサポートする場合は別の方法が必要です。
- CoreLocationをimportする
- 位置情報取得の許可状況を確認する
- CLLocationManagerオブジェクトを作る
- 必要なら利用許可をとる
- 位置情報の取得を開始する
順に見ていきましょう
CoreLocationをimportする
これはタイトルのままです。なお、CoreLocation.frameworkの追加は不要のようです。
import CoreLocation
位置情報取得の許可状況を確認する
まず、CLLocationManager.authorizationStatus()で取得許可の状況を取得します。この値がCLAuthorizationStatus.RestrictedやCLAuthorizationStatus.Deniedの時は位置情報の取得はできません。
let status = CLLocationManager.authorizationStatus()
if status == CLAuthorizationStatus.Restricted || status == CLAuthorizationStatus.Denied {
NSLog("Location is not available")
return
}
CLLocationManagerオブジェクトを作る
次に、CLLocationManagerオブジェクトを作ります。あとで使用するのでViewControllerのフィールドにしておきます。
manager = CLLocationManager()
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBest
必要なら利用許可をとる
アプリインストール直後など、位置情報の利用許可がまだとれていないときは、ステータスはCLAuthorizationStatus.NotDeterminedになっています。この時は利用許可をとるため、CLLocationManagerのrequestWhenInUseAuthorization()を呼びます。これを呼ばないと、後続のメソッドを呼んでも結果が返ってきません。
また、バックグラウンドでも位置情報を取得する場合は、requestAlwaysAuthorization()を呼びます。
if status == CLAuthorizationStatus.NotDetermined {
manager.requestWhenInUseAuthorization()
// バックグラウンドでも取得するときはこちら
// manager.requestAlwaysAuthorization()
}
これらのメソッドを呼ぶと、次のように確認をとるダイアログが出ます。この時、取得目的を表示する必要があるので、Info.plistにNSLocationWhenInUseUsageDescriptionとNSLocationAlwaysUsageDescriptionを追加します。
位置情報の取得を開始する
利用許可までとれたら、CLLocationManagerのstartUpdatingLocation()で位置情報の取得を開始します。位置情報が変化したら、delegateのlocationManager:didUpdateLocationsが呼ばれます。
ここまでをまとめると、次のようなコードになります。
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
var manager : CLLocationManager! = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let status = CLLocationManager.authorizationStatus()
if status == CLAuthorizationStatus.Restricted || status == CLAuthorizationStatus.Denied {
NSLog("Location is not available")
return
}
manager = CLLocationManager()
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBest
if status == CLAuthorizationStatus.NotDetermined {
manager.requestWhenInUseAuthorization()
// manager.requestAlwaysAuthorization()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func buttonClicked(sender: AnyObject) {
if manager != nil {
manager.startUpdatingLocation()
}
}
//MARK: CLLocationManagerDelegate
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
NSLog("lat=%lf lon=%lf", locations[0].coordinate.latitude, locations[0].coordinate.longitude)
}
}