読者です 読者をやめる 読者になる 読者になる

koogawa log

iOS、Android、foursquareに関する話題

【Tips】iOSで位置情報を取得する方法(Swift 3.0対応)

※数年前に書いたこちらの記事が古くなってきたので、Swift編 として書き直しました。

blog.koogawa.com


CoreLocationを使って、緯度・経度を取得する方法をメモしておきます。

実行環境

実装方法

準備

まずは「CoreLocation.framework」を追加します。

f:id:koogawa:20131122152458p:plain

次に Info.plist の NSLocationWhenInUseUsageDescription位置情報を使用する目的 を記載します。この内容はユーザに位置情報の使用を許可する際に表示されます。

f:id:koogawa:20160326145627p:plain

実装

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

サンプルコード

注意点

  • シミュレータでテストする場合は、メニュー > Debug > Location から位置情報をカスタマイズできます
  • 位置情報のアクセス権限について詳しく知りたい場合は下記の記事を参照してください

blog.koogawa.com

参考リンク