Запросить разрешения еще раз после того, как пользователь отказывается от услуг определения местоположения?

Я отслеживаю местоположение пользователя и спрашиваю разрешение, когда моя загрузка сначала загружается, используя это:

locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()

Если пользователь отказывается, но позже передумает, включив опцию конфигурации в моем приложении, как мне снова спросить? Например, у меня есть переключатель для автоматического определения местоположения пользователя, поэтому, когда они его включают, я пытаюсь сделать это:

@IBAction func gpsChanged(sender: UISwitch) {
    // Request permission for auto geolocation if applicable
    if sender.on {
        locationManager.requestAlwaysAuthorization()
        locationManager.startUpdatingLocation()
    }
}

Но этот код, похоже, ничего не делает. Я надеялся, что он снова спросит пользователя, хотят ли они, чтобы приложение отслеживало местоположение пользователя. Это возможно?

4 ответа

Решение

ОС только когда-либо предложит пользователю один раз. Если они отказывают в разрешении, это все. Что вы можете сделать, это направить пользователя к настройкам для вашего приложения, передав UIApplicationOpenSettingsURLString в UIApplication"s openURL: метод. Оттуда они могут повторно включить службы определения местоположения, если они желают. Тем не менее, вы, вероятно, не должны быть слишком агрессивными в том, чтобы вызывать у них проблемы для разрешения.

Всплывающее окно разрешения отображается только один раз. Поэтому мы должны перенаправить пользователей в Настройки после этого. Вот код в Swift:

 @IBAction func userDidClickButton(_ sender: Any) {

    // initialise a pop up for using later
    let alertController = UIAlertController(title: "TITLE", message: "Please go to Settings and turn on the permissions", preferredStyle: .alert)
    let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
        guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
            return
        }
        if UIApplication.shared.canOpenURL(settingsUrl) {
            UIApplication.shared.open(settingsUrl, completionHandler: { (success) in }
         }
    }
    let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
    alertController.addAction(cancelAction)
    alertController.addAction(settingsAction)

    // check the permission status
    switch(CLLocationManager.authorizationStatus()) {
        case .authorizedAlways, .authorizedWhenInUse:
            print("Authorize.")
            // get the user location
        case .notDetermined, .restricted, .denied:
            // redirect the users to settings
            self.present(alertController, animated: true, completion: nil)
    }
}

У вас может быть альтернативное решение!! Вы можете показать свое собственное предупреждение с лучшим сообщением, которое может убедить вашего пользователя разрешить получать push-уведомления для вашего приложения. Если пользователь разрешает, то только вы показываете уведомление о разрешении по умолчанию для включения push-уведомлений, в противном случае, если пользователь не разрешает, не показывает предупреждение по умолчанию, вы можете сохранить соответствующий флаг в вашей базе данных или NSUserDefaults и позже снова и снова запрашивать пользователя. некоторые события в вашем приложении.

У тебя только один шанс. Чтобы пользователь мог разрешить разрешения после их отказа, он должен пройти через приложение "Настройки". См. Запрос разрешения на использование служб определения местоположения в CLLocationManager.

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

https://github.com/CrazyPro007/PermissionManager/tree/master/PermissionManager/PermissionManager

Для api Health Kit. Разработчики могут просто добавить еще одно разрешение вreadTypes Set<HKObjectType>и пользователю будет повторно предложено разрешить разрешения. Я не совсем уверен, работает ли это так же со службами определения местоположения.

Другие вопросы по тегам