Запросить разрешения снова после того, как пользователь откажется от служб определения местоположения?
Я отслеживаю местоположение пользователя и запрашиваю разрешение, когда моя загрузка сначала загружается с помощью этого:
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.
Ответ 5
Я создал библиотеку, включающую диспетчер разрешений для уведомления, который обрабатывает оповещение о разрешении даже после того, как пользователь отклонил разрешение.
https://github.com/CrazyPro007/PermissionManager/tree/master/PermissionManager/PermissionManager