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