Почему необходимо запрашивать все разрешения перед отображением приложения в настройках?

#ios #swift #xcode #permissions

#iOS #swift #xcode #разрешения

Вопрос:

Мое приложение отслеживает пользователя и позволяет ему создавать аннотации / маркеры с сохраненной в них информацией / изображениями. Это мои данные.список использований разрешений.

 <key>NSAppleMusicUsageDescription</key>
<string>info</string>
<key>NSCameraUsageDescription</key>
<string>info</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>info</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>info</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>info</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>info</string>
<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
    <string>location</string>
</array>
 

При использовании пользователя напрямую запрашивается разрешение на местоположение, чтобы показать его местоположение на карте. Затем, когда пользователь хочет начать отслеживать свою позицию, я запрашиваю разрешение AlwaysUsage и запрашиваю их на экране настроек приложений. На этом этапе он не найдет экран настроек приложений.

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

Вот как я запрашиваю разрешения внутри настроек:

 func showSettingsAlert(){
    let alert = UIAlertController(title: C.Alert.settingsTitle, message: C.Alert.settingsMessage, preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: C.Alert.setting, style: .default, handler: { action in
        
        UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
    }))
    alert.addAction(UIAlertAction(title: C.Alert.cancel, style: .default, handler: nil))
    self.present(alert, animated: true, completion: nil)
}
 

Предназначено ли это? Нужно ли запрашивать все разрешения в начале выполнения, прежде чем я смогу отправить пользователя на экран настроек приложений? Что я пропустил?

Комментарии:

1. В любом случае вы не должны направлять пользователя к настройкам для этого варианта использования. Существует разница между разрешением на местоположение «всегда» (которое должен предоставить пользователь) и фоновым местоположением (которое ваше приложение может использовать без разрешения always). Правильный подход — просто запрашивать разрешение всегда, когда оно вам нужно, а также включать фоновое расположение в вашем диспетчере местоположений. Ваше приложение получит предварительное разрешение «всегда», вы получите местоположение в фоновом режиме, и пользователю будет предложено предоставить вам true always через некоторое время. По этому вопросу проводится сессия wwdc 2019

2. @Paulw11 Я этого не знал. Очевидно, что это правильный способ сделать это. Даже если это не ответ на мой вопрос, я надеюсь, что люди прочитают это!

Ответ №1:

Если вы хотите направить пользователя на панель настроек, прежде чем запрашивать какие-либо разрешения, вы можете добавить Settings.bundle в свой проект. Это гарантирует, что панель настроек будет доступна сразу после установки.


Редактировать:
Извините, я не понял, что вы пытаетесь сделать в первую очередь..

Каждое разрешение будет отображаться в настройках только после того, как вы запросили его в своем приложении.
Вы должны запрашивать у пользователя каждое разрешение в контексте, когда пользователь пытается использовать функцию, где требуется это разрешение. Пользователь должен понимать, почему вы запрашиваете это разрешение.
Поэтому не рекомендуется запрашивать все ваши разрешения при запуске вашего приложения.

Например:
запрашивать местоположение, когда пользователь открывает карту и хочет увидеть свое местоположение.
Запрашивайте разрешение камеры, когда пользователь нажимает кнопку «сканировать QR-код» или кнопку «сделать снимок». И т.д..

Комментарии:

1. Именно так я сейчас запрашиваю разрешения в приложении. Я только спрашиваю, когда оно будет использоваться. Проблема в том, что мне нужно запрашивать местоположение в фоновом режиме. Я отправляю пользователя в настройки приложения. Но они не дойдут до настроек приложения, прежде чем я также запрошу разрешения на фотографии. Я не хочу запрашивать разрешение на фотографию перед ее использованием. Настройки приложения не отображаются до определения местоположения стенда при запросе использования и камеры. Пользователи должны иметь возможность получить доступ к настройкам приложения и выбрать location alwaysUsage, прежде чем спрашивать о камере (возможно, им никогда не понадобится / не захочется использовать камеру)

2. Тогда, возможно, попробуйте подход settings.bundle. При этом настройки будут доступны наверняка.