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