Подтвердить что ты не робот

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()
    }
}

Может ли кто-нибудь сообщить мне, что может быть причиной этого?

4b9b3361

Ответ 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
        }
    }