Запросить разрешение для камеры и библиотеки в iOS 10 - Info.plist

88

Я реализовал WKWebView в приложении. на показанной веб-странице есть входной файл, куда следует импортировать изображение из фотографий. Всякий раз, когда я нажимаю на этот ввод и выбираю «Сделать фото» или «Фотогалерея», приложение внезапно аварийно завершает работу, что, как я полагаю, происходит из-за того, что у приложения отсутствует разрешение на создание фотографии или импорт из библиотеки.

Как отправить запрос на разрешение, когда пользователь выбирает один из упомянутых методов («Сделать фото» или «Фото из библиотеки»)?

Я использую Swift 3.0 с WKWebView.

Аламри
источник
1
@KiritModi Привет, большое спасибо. Не могли бы вы отправить его в качестве ответа, чтобы я принял его.
Аламри
1
Oky .. i Will ...
Кирит Моди
К вашему сведению: документы UIImagePickerController никогда не обновлялись для этого требования iOS10 + (я просмотрел каждую страницу, включая устаревшие документы Objective-C)
benc

Ответы:

106

Вы должны добавить указанное ниже разрешение в Info.plist. Больше ссылок

Камера:

Key       :  Privacy - Camera Usage Description   
Value     :  $(PRODUCT_NAME) camera use

Фото :

Key       :  Privacy - Photo Library Usage Description    
Value     :  $(PRODUCT_NAME) photo use
Кирит Моди
источник
Я все еще новичок в IOS, особенно в ее родных языках, Objective-c и Swift. Это спасло мне день .. Большое спасибо
Аламри
Привет, у меня действительно возникли проблемы с тем, чтобы пользователи iPhone7 могли настроить разрешение для библиотеки фотографий. Когда пользователи iPhone7 переходят в настройки моего приложения на своем телефоне, опция библиотеки фотографий отсутствует. У меня есть ключ: значение, упомянутое выше, в моем info.plist. Странно то, что все устройства под управлением iOS 10 могут видеть эту опцию, кроме пользователей iPhone7. Например, iPhone6 ​​под управлением iOS 10 может видеть эту опцию. Я что-то еще упускаю?
DevKyle 05
1
Вы не должны включать PRODUCT_NAME в эти значения, поскольку он уже включен в сообщение Apple. например, «Имя приложения»
Харрис,
124

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

Обновление Swift 4:

    //Camera
    AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in
        if response {
            //access granted
        } else {

        }
    }

    //Photos
    let photos = PHPhotoLibrary.authorizationStatus()
    if photos == .notDetermined {
        PHPhotoLibrary.requestAuthorization({status in
            if status == .authorized{
                ...
            } else {}
        })
    }

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

Георгий Вардикос
источник
5
Спасибо, этот ответ сработал для меня! Для людей, использующих Swift 4, первая строка должна быть изменена на: «AVCaptureDevice.requestAccess (for: AVMediaType.video) {response in».
Кевин
1
Спасибо за этот ответ. Работает отлично. Хотя меня это интересовало. Когда вы запускаете requestAuthorization, создает ли он своего рода прослушиватель, который ждет, пока не будет установлено разрешение, перед запуском его кода? Сначала я подумал, что выполнение этого кода просто остановилось на PHPhotoLibrary.authorizationStatus, но после удаления кучи операторов печати вокруг него кажется, что он продолжает работать?
Джордж Кендрос
4
Swift 3 : AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in. Не забывай import AVFoundation.
iurii
2
Спасибо за ответ. Без него мое приложение было отклонено, потому что приложение могло получить доступ к библиотеке фотографий без разрешения.
Makalele
44

Info.plist

Ограниченное количество фотографий

<key>PHPhotoLibraryPreventAutomaticLimitedAccessAlert</key>
<true/>

Камера

<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) camera description.</string>

Фото

<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME)photos description.</string>

Сохранить фото

<key>NSPhotoLibraryAddUsageDescription</key>
<string>$(PRODUCT_NAME) photos add description.</string>

Расположение

<key> NSLocationWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) location description.</string>

Apple Музыка

<key>NSAppleMusicUsageDescription</key>
<string>$(PRODUCT_NAME) My description about why I need this capability</string>

Календарь

<key>NSCalendarsUsageDescription</key>
<string>$(PRODUCT_NAME) My description about why I need this capability</string>

Siri

<key>NSSiriUsageDescription</key>
<string>$(PRODUCT_NAME) My description about why I need this capability</string>
Вишал Вагасия
источник
28

Используйте настройки plist, упомянутые выше, и соответствующий аксессор (AVCaptureDevice или PHPhotoLibrary), но также предупредите их и отправьте их в настройки, если вам это действительно нужно, например:

Swift 4.0 и 4.1

func proceedWithCameraAccess(identifier: String){
    // handler in .requestAccess is needed to process user's answer to our request
    AVCaptureDevice.requestAccess(for: .video) { success in
      if success { // if request is granted (success is true)
        DispatchQueue.main.async {
          self.performSegue(withIdentifier: identifier, sender: nil)
        }
      } else { // if request is denied (success is false)
        // Create Alert
        let alert = UIAlertController(title: "Camera", message: "Camera access is absolutely necessary to use this app", preferredStyle: .alert)

        // Add "OK" Button to alert, pressing it will bring you to the settings app
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
          UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!)
        }))
        // Show the alert with animation
        self.present(alert, animated: true)
      }
    }
  }
Джоэл Теплый
источник
21

Файл: Info.plist

Для камеры :

<key>NSCameraUsageDescription</key>
<string>You can take photos to document your job.</string>

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

<key>NSPhotoLibraryUsageDescription</key>
<string>You can select photos to attach to reports.</string>
Эд Горы
источник
14

Swift 5 Самый простой способ добавить разрешения без необходимости делать это программно - это открыть файл info.plist и выбрать + рядом со списком свойств информации. Прокрутите раскрывающийся список до параметров конфиденциальности и выберите Privacy Camera Usage Description для доступа к камере или Privacy Photo Library Usage Description для доступа к библиотеке фотографий. Заполните значение String справа после того, как вы сделали свой выбор, чтобы включить текст, который вы хотели бы отображать для вашего пользователя, когда всплывающее предупреждение запрашивает разрешения.Разрешение камеры / фото библиотеки

Elarcoiris
источник
11

Чтобы запросить разрешение для приложения для фотографий, вам необходимо добавить этот код (Swift 3) :

PHPhotoLibrary.requestAuthorization({ 
       (newStatus) in 
         if newStatus ==  PHAuthorizationStatus.authorized { 
          /* do stuff here */ 
    } 
})
Marcomoreira92
источник
не забудьте добавить <key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>в info.plist
marcomoreira92
Стэндж, у меня нет проблем. Я добавил этот код в кнопку, и я использую свой iphone с iOS 10.3.1 для тестирования, и он отлично работает
marcomoreira92
4

Я написал расширение, которое учитывает все возможные случаи:

  • Если доступ разрешен, то код onAccessHasBeenGrantedбудет запущен.
  • Если доступ не определен, то requestAuthorization(_:) будет вызван.
  • Если пользователь отказал вашему приложению в доступе к библиотеке фотографий, ему будет показано окно, предлагающее перейти к настройкам и разрешить доступ. В этом окне ему будут доступны кнопки «Отмена» и «Настройки». Когда он нажимает кнопку «настройки», откроются настройки вашего приложения.

Пример использования:

PHPhotoLibrary.execute(controller: self, onAccessHasBeenGranted: {
    // access granted... 
})

Код расширения:

import Photos
import UIKit

public extension PHPhotoLibrary {

   static func execute(controller: UIViewController,
                       onAccessHasBeenGranted: @escaping () -> Void,
                       onAccessHasBeenDenied: (() -> Void)? = nil) {

      let onDeniedOrRestricted = onAccessHasBeenDenied ?? {
         let alert = UIAlertController(
            title: "We were unable to load your album groups. Sorry!",
            message: "You can enable access in Privacy Settings",
            preferredStyle: .alert)
         alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
         alert.addAction(UIAlertAction(title: "Settings", style: .default, handler: { _ in
            if let settingsURL = URL(string: UIApplication.openSettingsURLString) {
               UIApplication.shared.open(settingsURL)
            }
         }))
         controller.present(alert, animated: true)
      }

      let status = PHPhotoLibrary.authorizationStatus()
      switch status {
      case .notDetermined:
         onNotDetermined(onDeniedOrRestricted, onAccessHasBeenGranted)
      case .denied, .restricted:
         onDeniedOrRestricted()
      case .authorized:
         onAccessHasBeenGranted()
      @unknown default:
         fatalError("PHPhotoLibrary::execute - \"Unknown case\"")
      }
   }

}

private func onNotDetermined(_ onDeniedOrRestricted: @escaping (()->Void), _ onAuthorized: @escaping (()->Void)) {
   PHPhotoLibrary.requestAuthorization({ status in
      switch status {
      case .notDetermined:
         onNotDetermined(onDeniedOrRestricted, onAuthorized)
      case .denied, .restricted:
         onDeniedOrRestricted()
      case .authorized:
         onAuthorized()
      @unknown default:
         fatalError("PHPhotoLibrary::execute - \"Unknown case\"")
      }
   })
}
дрон-поп
источник
0

Отличный способ реализации сеанса камеры в Swift 5 , iOS 13

https://github.com/egzonpllana/CameraSession

Camera Session - это приложение для iOS, которое пытается сделать самый простой способ реализации AVCaptureSession.

Через приложение вы можете найти реализованные сеансы камеры:

  • Родная камера для фото или записи видео.
  • Родной способ импорта фото и видео.
  • Пользовательский способ выбора ресурсов, таких как фотографии и видео, с возможностью выбора одного или нескольких ресурсов из библиотеки.
  • Пользовательская камера для съемки фото или видео с возможностью удержания кнопки и записи.
  • Отдельные запросы на разрешение камеры.

Пользовательские функции камеры, такие как фонарик и параметры поворота камеры .

Doci
источник