Проверка разрешений в Swift 2.0

#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 (что странно, но неважно) — добавление всех описаний, о которых я могу подумать, похоже, устранило проблему