CLLocationManagerDelegate
を実装するビューコントローラーがあります。 CLLocationManager変数を作成します。
let locationManager = CLLocationManager()
次に、viewDidLoad
でプロパティを設定します。
// Set location manager properties
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
locationManager.distanceFilter = 50
問題は、認証ステータスを確認する前でも関数が呼び出されることです。
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if (status == .AuthorizedWhenInUse) {
// User has granted autorization to location, get location
locationManager.startUpdatingLocation()
}
}
誰かがこれを引き起こす原因を教えてくれますか?
- locationManager:didChangeAuthorizationStatus:
は、CLLocationManager
が初期化された直後に呼び出されます。
必要に応じて、デリゲートメソッド内で承認をリクエストできます。
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
switch status {
case .NotDetermined:
locationManager.requestAlwaysAuthorization()
break
case .AuthorizedWhenInUse:
locationManager.startUpdatingLocation()
break
case .AuthorizedAlways:
locationManager.startUpdatingLocation()
break
case .Restricted:
// restricted by e.g. parental controls. User can't enable Location Services
break
case .Denied:
// user denied your app access to Location Services, but can grant access from Settings.app
break
default:
break
}
}
これを機能させたい場合は、「適時に」問題でデリゲートを割り当てる必要があることに注意してください。
デリゲートの割り当てをなんとかして延期する場合。非同期に設定すると、- locationManager:didChangeAuthorizationStatus:
への最初の呼び出しを見逃す可能性があります。
Swift
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
switch status {
case .notDetermined:
manager.requestAlwaysAuthorization()
break
case .authorizedWhenInUse:
manager.startUpdatingLocation()
break
case .authorizedAlways:
manager.startUpdatingLocation()
break
case .restricted:
// restricted by e.g. parental controls. User can't enable Location Services
break
case .denied:
// user denied your app access to Location Services, but can grant access from Settings.app
break
}
}
他の答えは、新しい望ましくない動作を引き起こす可能性があります。
最初の呼び出しを防ぐためにブール値とガードを追加するだけで、いくつかのコメントでバグを説明できます。
var firstTimeCalled = true
// ...
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
guard !firstTimeCalled else {
firstTimeCalled = false
return
}
// ... send status to listeners
}