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

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

locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()

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

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

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

Ответ 1

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

Ответ 2

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

 import CoreLocation 
 @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)
    }
}

Ответ 3

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

Ответ 4

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