iOS14 での CLLocationManager の変更点
検証環境:
Xcode 12.4
Swift 5.3.2
iOS Deployment Target 14.4
iOS で位置情報を取得するにはCLLocationManager
を使用するのだが、iOS14から使い方が少し変更になったのでメモ。
1つ目がアプリが位置情報サービスの使用するための承認ステータスauthorizationStatus
が、以前はクラスメソッドの
CLLocationManager.authorizationStatus()
を使って取得していたがこれが Deprecated になり、iOS14からは CLLocationManager のプロパティ
locationManager.authorizationStatus
に変更された。
2つ目が承認ステータスに変更があった時に呼び出される CLLocationManager のデリゲートメソッド
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
を使っていたがこれが Deprecated になり、iOS14からは
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager)
を使うことになった。
iOS14 で現在位置を取得する簡単なサンプルコード
import UIKit import CoreLocation class ViewController: UIViewController { let locationManager = CLLocationManager() override func viewDidLoad() { super.viewDidLoad() locationManager.delegate = self if CLLocationManager.locationServicesEnabled() { locationManager.requestWhenInUseAuthorization() // 位置情報サービスを使用するために許可を要求する } else { print("位置情報の使用を許可してください") } } } extension ViewController: CLLocationManagerDelegate { // ↓iOS14から追加された新しいデリゲートメソッド func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { // ↓iOS14から追加された新しいプロパティ switch manager.authorizationStatus { case .notDetermined: // 初回呼び出し時、設定で次回確認を選択時 print("notDetermined") break case .restricted: // ペアレンタルコントロールなどの制限あり print("restricted") break case .denied: // 使用拒否した print("denied") break case .authorizedAlways: // いつでも位置情報サービスを開始することを許可した print("authorizedAlways") manager.startUpdatingLocation() // 位置情報の取得開始 break case .authorizedWhenInUse: // アプリ使用中のみ位置情報サービスを開始することを許可した print("authorizedWhenInUse") manager.startUpdatingLocation() // 位置情報の取得開始 @unknown default: break } // iOS14から追加された位置情報精度 switch manager.accuracyAuthorization { case .fullAccuracy: // 正確な位置情報 print("fullAccuracy") break case .reducedAccuracy: // おおよその位置情報 print("reducedAccuracy") break @unknown default: break } } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { print("didUpdateLocations: \(locations)") // 位置情報の取得成功 manager.stopUpdatingLocation() // 位置情報の収集終了 } func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { print("didFailWithError: \(error)") // 位置情報の取得失敗 } }
Info.plist に
Privacy - Location When In Use Usage Description
NSLocationWhenInUseUsageDescription
または
Privacy - Location Always and When In Use Usage Description
NSLocationAlwaysAndWhenInUseUsageDescription
の追加も忘れずに。