概要
swiftで位置情報を取得する方法について、まとめました。
startUpdatingLocation() で位置情報の取得を開始し、取得した場合 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) が呼び出され位置情報を確認することだできます。
class ViewController: UIViewController, CLLocationManagerDelegate {
      var locationManager : CLLocationManager?
      override func viewDidLoad() {
            super.viewDidLoad()
            locationManager = CLLocationManager()
            locationManager!.delegate = self
            //位置情報を使用可能か
            if CLLocationManager.locationServicesEnabled() {
            
                 //位置情報の取得開始
                 locationManager!.startUpdatingLocation()
            
            }
     }
     // 位置情報を取得した場合
     func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
     }
}
info.listに追記
位置情報を取得する場合、info.list に「Location Always and When In Use Usage Description」、「Location When In Use Usage Description」を追加し位置情報どのように使用するか記載する必要があります。
info.list
// ユーザーの位置情報へのアクセスを常に要求している理由を記載します。
Privacy - Location Always and When In Use Usage Description
// フォアグラウンドで実行されているときに、アプリがユーザーの位置情報へのアクセスを要求する理由を記載します。
Privacy - Location When In Use Usage Description
位置情報を取得する際の設定
位置情報を取得する際に、精度や取得間隔の指定ができます。
locationManager = CLLocationManager()
locationManager!.delegate = self
        
// 常に使用する場合、バックグラウンドでも取得するようにする
if CLLocationManager.authorizationStatus() == .authorizedAlways {
     // バックグラウンドでも取得する
     locationManager!.allowsBackgroundLocationUpdates = true
} else {
     // バックグラウンドでは取得しない
     locationManager!.allowsBackgroundLocationUpdates = false
}
// 位置情報の取得精度を指定します
locationManager!.desiredAccuracy = kCLLocationAccuracyBest
// 更新に必要な最小移動距離
// Int値を指定することで、○○m間隔で取得するようになります
locationManager!.distanceFilter = 10
// 移動手段を指定します
// 徒歩、自動車等
locationManager!.activityType = .fitness
// 位置情報取得開始
locationManager!.startUpdatingHeading()
CLLocationManager.authorizationStatusの設定値
| authorizationStatus | 設定 | 
|---|---|
| .notDetermined | 未設定 | 
| .restricted | 機能が制限されている | 
| .denied | 許可しない | 
| .authorizedWhenInUse | このAppの使用中のみ許可 | 
| .authorizedAlways | 常に許可 | 
activityTypeの設置値
| activityType | 移動手段 | 
|---|---|
| .fitness | 徒歩 | 
| .automotiveNavigation | 自動車 | 
| .other | その他 | 
desiredAccuracyの設置値
| desiredAccuracy | 精度 | 
|---|---|
| kCLLocationAccuracyBestForNavigation | デフォルト | 
| kCLLocationAccuracyBest | 最高精度 | 
| kCLLocationAccuracyNearestTenMeters | 10m以内 | 
| kCLLocationAccuracyHundredMeters | 100m以内 | 
| kCLLocationAccuracyKilometer | 1km以内 | 
| kCLLocationAccuracyThreeKilometers | 3km以内 | 
位置情報を取得した場合
位置情報を取得した場合以下の、関数を呼び出し緯度経度等の情報を取得できます。
// 位置情報取得した場合
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        
     guard let newLocation = locations.last else {
          return
     }
     let location:CLLocationCoordinate2D
            = CLLocationCoordinate2DMake(newLocation.coordinate.latitude, newLocation.coordinate.longitude)
        
     let formatter: DateFormatter = DateFormatter()
     formatter.timeZone   = TimeZone(identifier: "Asia/Tokyo")
     formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
     let date = formatter.string(from: newLocation.timestamp)
   print("緯度:", location.latitude, "経度:", location.longitude, "時間:", date)
}
