Проверка прав доступа iOS перед запросом или началом сбора - PullRequest
0 голосов
/ 28 апреля 2020

Мне неясно, как Apple собирается начать мониторинг местоположения. Скажем, я хочу запросить «Всегда» авторизацию и получить обратные вызовы местоположения, включенные startUpdatingLocation(). Документы Apple для requestAlwaysAuthorization() говорят:

Вы можете вызывать requestAlwaysAuthorization (), когда текущее состояние авторизации равно .notDetermined или .authorizedWhenInUse. ... Ваше приложение больше не может запрашивать авторизацию Always после того, как пользователь ответит на это приглашение. Повторный вызов этого метода не будет иметь никакого эффекта.

Это означает, что мы должны проверить состояние перед вызовом. Однако в документах по authorizationStatus() говорится:

Использование authorizationStatus () не нужно и не рекомендуется. Вместо этого реализуйте функцию обратного вызова делегата locationManager (_: didChangeAuthorization :), чтобы получить актуальный статус авторизации.

Так что вам следует просто всегда вызывать requestAlwaysAuthorization() при запуске, даже если у вас уже есть разрешения, а затем позвоните startUpdatingLocation(), если вы получаете статус «авторизованный» в didChangeAuthorization обратном вызове? Гарантирован ли обратный вызов? Или вам следует просто позвонить startUpdatingLocation() независимо от того, получили ли вы авторизованный обратный вызов или нет, и вы начнете получать обновления, когда разрешения позволят это? Последнее, что я видел в тестировании, но я не хочу идти вразрез с рекомендациями Apple по этому вопросу.

1 Ответ

0 голосов
/ 28 апреля 2020

Вы должны вызывать requestAlwaysAuthorization () при запуске таким образом -

override func viewDidLoad() {
    super.viewDidLoad()

    locationManager = CLLocationManager()
    locationManager?.delegate = self
    locationManager?.requestAlwaysAuthorization()
}

, а затем вызывать startUpdatingLocation (), как только вы получите результат

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedAlways {
         // start updating location here
    }
}

Всегда вызывается didChangeAuthorization и если пользователь уже дал разрешение, код будет выполняться нормально, в противном случае, когда пользователь даст разрешение, код будет выполнен после соответствия условию.

...