Запросить разрешения еще раз после того, как пользователь отказывается от услуг определения местоположения?
Я отслеживаю местоположение пользователя и спрашиваю разрешение, когда моя загрузка сначала загружается, используя это:
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>
и пользователю будет повторно предложено разрешить разрешения. Я не совсем уверен, работает ли это так же со службами определения местоположения.