モケラ

Tech Sheets

mokelab

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)
    }
}

一覧に戻る