Swift LocationManager didChangeAuthorizationStatus всегда вызывался
У меня есть контроллер вида, который реализует 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()
}
}
Может ли кто-нибудь сообщить мне, что может быть причиной этого?
Ответы
Ответ 1
- 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:
.
Ответ 2
Swift 3
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
}
}