Я реализовал WKWebView в приложении. на показанной веб-странице есть входной файл, куда следует импортировать изображение из фотографий. Всякий раз, когда я нажимаю на этот ввод и выбираю «Сделать фото» или «Фотогалерея», приложение внезапно аварийно завершает работу, что, как я полагаю, происходит из-за того, что у приложения отсутствует разрешение на создание фотографии или импорт из библиотеки.
Как отправить запрос на разрешение, когда пользователь выбирает один из упомянутых методов («Сделать фото» или «Фото из библиотеки»)?
Я использую Swift 3.0 с WKWebView.
Ответы:
Вы должны добавить указанное ниже разрешение в Info.plist. Больше ссылок
Камера:
Key : Privacy - Camera Usage Description Value : $(PRODUCT_NAME) camera use
Фото :
Key : Privacy - Photo Library Usage Description Value : $(PRODUCT_NAME) photo use
источник
Вы также можете запросить доступ программно, что я предпочитаю, потому что в большинстве случаев вам нужно знать, получили ли вы доступ или нет.
Обновление 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 {} }) }
Вы не делитесь кодом, поэтому я не могу быть уверен, будет ли это полезно для вас, но в целом используйте его как лучшую практику.
источник
AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in
. Не забывайimport AVFoundation
.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>
источник
Используйте настройки 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) } } }
источник
Файл: 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>
источник
Swift 5 Самый простой способ добавить разрешения без необходимости делать это программно - это открыть файл info.plist и выбрать + рядом со списком свойств информации. Прокрутите раскрывающийся список до параметров конфиденциальности и выберите Privacy Camera Usage Description для доступа к камере или Privacy Photo Library Usage Description для доступа к библиотеке фотографий. Заполните значение String справа после того, как вы сделали свой выбор, чтобы включить текст, который вы хотели бы отображать для вашего пользователя, когда всплывающее предупреждение запрашивает разрешения.
источник
Чтобы запросить разрешение для приложения для фотографий, вам необходимо добавить этот код (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Я написал расширение, которое учитывает все возможные случаи:
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\"") } }) }
источник
Отличный способ реализации сеанса камеры в Swift 5 , iOS 13
https://github.com/egzonpllana/CameraSession
Camera Session - это приложение для iOS, которое пытается сделать самый простой способ реализации AVCaptureSession.
Через приложение вы можете найти реализованные сеансы камеры:
Пользовательские функции камеры, такие как фонарик и параметры поворота камеры .
источник