#ios #permissions #swift2 #touch-up-inside
#iOS #разрешения #swift2 #подправка — внутри
Вопрос:
Независимо от того, где я добавляю код для проверки разрешений для таких вещей, как камера / микрофон / фотографии, всплывающее подтверждение всегда убивает мое приложение или отправляет мне обратно несколько контроллеров просмотра.
Пример выглядит следующим образом.
У меня есть несколько контроллеров просмотра (частично в процессе регистрации), когда у меня есть страница, которая касается разрешений. Пользователи нажимают кнопку, чтобы настроить разрешение камеры, в котором используется следующий код.
if AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) != AVAuthorizationStatus.Authorized {
AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted :Bool) -> Void in
if granted == true {
// do something
} else {
// determine whether not determined, denied etc and do something else
}
});
}
Однако, как только появляется подтверждение iOS, оно возвращает приложению 2 контроллера просмотра. В других случаях (например, на a viewDidLoad
) запросы разрешений завершают работу приложения, как только выбор сделан.
Есть идеи, чего мне не хватает в моей настройке или как предотвратить такое поведение?
Спасибо.
Комментарии:
1. как насчет отказа?
2. @Misha — я понимаю, что у пользователя есть больше возможностей для выбора, и они рассматриваются при необходимости, но, по-моему, не имеют отношения к вопросу
3. но как приложение будет решать , что делать в случае отказа в разрешении? в другом примечании вы добавили ключи в plist?
4. @misha — он решит, что делать, основываясь на том, что говорит код — в данном случае он на самом деле ничего не делает, но дело в том, что представление откатывается при появлении всплывающего окна — остальное не имеет значения, но я отредактирую вопрос, чтобы избежать путаницы в будущем
5. Независимо от того, что он делает, если не авторизован, дело в том, что я всегда авторизую, но процесс завершается сбоем или откатывает просмотры, либо как только он запрашивает решение, либо при авторизации
Ответ №1:
Я думаю, вы неправильно поняли мой комментарий, я имел в виду, что
if AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) != AVAuthorizationStatus.Authorized { // here you are checking if it's not authorized i..e it's denied, NotDetermined or Restricted
....
}
else if if AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) == AVAuthorizationStatus.Authorized
// do the something in case it's autorized
Я перечисляю ключи здесь —
<key>NSPhotoLibraryUsageDescription</key>
<string>This app requires access to the photo library.</string>
<key>NSCameraUsageDescription</key>
<string>This app requires access to the camera.</string>
Комментарии:
1. Спасибо, Миша — у меня есть проверка статуса для определения текущего состояния и другой код (предоставлено == true) для определения их выбора во всплывающем окне — что касается ключей, я добавляю их, поскольку у меня есть один для NSLocationWhenInUseUsageDescription, но для камеры / фотографий используется ключ ‘Конфиденциальность- Описание использования камеры ‘ (не уверен, откуда я взял этот ключ) — скоро вернусь с результатами
2. кажется, у меня была пропущенная запись в info.plist для одного из описаний, из-за которого он отображался в ближайшем NavigationController (что странно, но неважно) — добавление всех описаний, о которых я могу подумать, похоже, устранило проблему