Запит дозволу на камеру та бібліотеку в iOS 10 - Info.plist


84

Я застосував WKWebView в додатку. на показаній веб-сторінці є файл, де він повинен імпортувати зображення з фотографій. Кожного разу, коли я натискаю на цей вхід і вибираю або «Сфотографувати», або «Бібліотека фотографій», програма раптово виходить з ладу, що, на мою думку, пов’язано з тим, що програмі бракує дозволу робити фотографії або імпортувати з бібліотеки.

Як надіслати запит на отримання дозволу, коли користувач вибирає один із згаданих способів (зробити фотографію або бібліотеку фотографій)?

Я використовую Swift 3.0 з WKWebView.


1
@KiritModi Привіт, велике спасибі. Чи можете ви, будь ласка, опублікувати це як відповідь, щоб я міг прийняти це.
Аламрі

1
Окі .. я буду ...
Кіріт Моді

FYI: Документи UIImagePickerController ніколи не оновлювались для цієї вимоги до iOS10 + (я обробляв кожну сторінку, включаючи застарілі документи Objective-C)
benc,

Відповіді:


104

Ви повинні додати вказаний нижче дозвіл у 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

1
Не слід включати PRODUCT_NAME до цих значень, оскільки це вже включено до повідомлення Apple. наприклад, "Назва програми" хотіла б отримати доступ до ваших фотографій
Гарріс,

122

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

Оновлення 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 {}
        })
    }

Ви не ділитесь кодом, тому я не можу бути впевненим, чи це буде корисно для вас, але загалом кажучи, використовуйте його як найкращу практику.


4
Дякую, ця відповідь у мене спрацювала! Для людей, які використовують Swift 4, перший рядок слід змінити на: "AVCaptureDevice.requestAccess (для: AVMediaType.video) {відповідь у".
Кевін

1
Дякую за цю відповідь. Це чудово працює. Я дивувався одній речі про це хоч. Коли ви запускаєте requestAuthorization, чи створює він якийсь прослуховувач, який чекає, поки не буде встановлено дозвіл, перш ніж запускати його код? Спочатку я хоч те, що виконання коду просто зупинилося на PHPhotoLibrary.authorizationStatus, але після скидання купу операторів друку здається, що воно продовжує йти ??
George Kendros

4
Swift 3 : AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in. Не забувайте це робити import AVFoundation.
iurii

2
Дякую за відповідь. Без нього мій додаток було відхилено, оскільки він міг отримати доступ до бібліотеки фотографій без дозволу.
Makalele

41

Файл: Info.plist

Камера

<key>NSCameraUsageDescription</key>
<string>camera description.</string>

Фотографії

<key>NSPhotoLibraryUsageDescription</key>
<string> photos description.</string>

Зберегти фотографії

  <key>NSPhotoLibraryAddUsageDescription</key>
  <string> photos add description.</string>

Розташування

<key> NSLocationWhenInUseUsageDescription</key>
<string> location description.</string>

Apple Music:

<key>NSAppleMusicUsageDescription</key>
<string>My description about why I need this capability</string>

Календар

<key>NSCalendarsUsageDescription</key>
<string>My description about why I need this capability</string>

Сірі

<key>NSSiriUsageDescription</key>
<string>My description about why I need this capability</string>

27

Скористайтеся згаданими вище налаштуваннями списку та відповідним засобом доступу (AVCaptureDevice або PHPhotoLibrary), але також сповістіть їх і надішліть у налаштування, якщо це вам дійсно потрібно, наприклад:

Свіфт 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)
      }
    }
  }

20

Файл: 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 і вибрати + біля списку Властивості інформації. Прокрутіть список, що випадає, до опцій конфіденційності та виберіть Опис використання приватної камери для доступу до камери, або Опис використання бібліотеки конфіденційності для доступу до бібліотеки фотографій. Введіть значення рядка праворуч після того, як ви зробили вибір, щоб включити текст, який ви хотіли б відображати своєму користувачеві, коли спливаюче сповіщення запитує дозволи.Дозвіл камери / фототеки


11

Щоб запитати дозвіл на додаток для фото, вам потрібно додати цей код (Swift 3) :

PHPhotoLibrary.requestAuthorization({ 
       (newStatus) in 
         if newStatus ==  PHAuthorizationStatus.authorized { 
          /* do stuff here */ 
    } 
})

не забудьте додати <key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>до списку
info.plist

stange, у мене немає жодних проблем. я додав цей код у кнопку, і я використовую свій iphone з iOS 10.3.1 для тестування, і він працює нормально
marcomoreira92

3

Я написав розширення, яке враховує всі можливі випадки:

  • Якщо доступ дозволений, тоді код 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.

За допомогою програми ви можете знайти такі сеанси камери:

  • Власна камера для фотографування чи відеозапису.
  • Рідний спосіб імпорту фотографій та відео.
  • Спеціальний спосіб вибору об’єктів, таких як фотографії та відео, з можливістю вибору одного чи кількох об’єктів із бібліотеки.
  • Спеціальна камера для зйомки фотографій або відеозаписів із можливістю утримувати кнопку та записувати.
  • Окремі запити на отримання дозволу камери.

Спеціальні функції камери, такі як факел та обертання камери .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.