【Swift】位置情報を取得する


# 概要

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)

}
```


#参考
[CLLocationManager](https://developer.apple.com/documentation/corelocation/cllocationmanager)