Implementé un WKWebView en una aplicación. hay una entrada de archivo en la página web mostrada donde debería importar una imagen de las fotos. Cada vez que presiono esa entrada y selecciono "Tomar foto" o "Biblioteca de fotos", la aplicación se bloquea repentinamente, lo que creo que se debe a que a la aplicación le falta el permiso para tomar una foto o importar de la biblioteca.
¿Cómo presiono una solicitud de permiso cuando el usuario selecciona uno de los métodos mencionados (Tomar foto o Biblioteca de fotos)?
Utilizo Swift 3.0 con WKWebView.
Respuestas:
Debe agregar el siguiente permiso en Info.plist. Más referencia
Camara:
Key : Privacy - Camera Usage Description Value : $(PRODUCT_NAME) camera use
Foto:
Key : Privacy - Photo Library Usage Description Value : $(PRODUCT_NAME) photo use
fuente
También puede solicitar acceso mediante programación, lo que prefiero porque en la mayoría de los casos necesita saber si tomó el acceso o no.
Actualización de 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 {} }) }
No comparte código, por lo que no puedo estar seguro de si esto sería útil para usted, pero en general úselo como una mejor práctica.
fuente
AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in
. No olvides hacerloimport AVFoundation
.Archivo: Info.plist
Cámara
<key>NSCameraUsageDescription</key> <string>camera description.</string>
Fotos
<key>NSPhotoLibraryUsageDescription</key> <string> photos description.</string>
Guardar fotografías
<key>NSPhotoLibraryAddUsageDescription</key> <string> photos add description.</string>
Ubicación
<key> NSLocationWhenInUseUsageDescription</key> <string> location description.</string>
Música de Apple:
<key>NSAppleMusicUsageDescription</key> <string>My description about why I need this capability</string>
Calendario
<key>NSCalendarsUsageDescription</key> <string>My description about why I need this capability</string>
Siri
<key>NSSiriUsageDescription</key> <string>My description about why I need this capability</string>
fuente
Use la configuración de plist mencionada anteriormente y el acceso apropiado (AVCaptureDevice o PHPhotoLibrary), pero también avíseles y envíelos a la configuración si realmente lo necesita, así:
Swift 4.0 y 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) } } }
fuente
Archivo: Info.plist
Para cámara :
<key>NSCameraUsageDescription</key> <string>You can take photos to document your job.</string>
Para la biblioteca de fotos , querrá que esta permita al usuario de la aplicación navegar por la biblioteca de fotos.
<key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>
fuente
Swift 5 La forma más fácil de agregar permisos sin tener que hacerlo de manera programática es abrir su archivo info.plist y seleccionar + junto a la lista de Propiedades de información. Desplácese por la lista desplegable hasta las opciones de Privacidad y seleccione Descripción de uso de la cámara de privacidad para acceder a la cámara, o Descripción de uso de la biblioteca de fotos de privacidad para acceder a la biblioteca de fotos. Complete el valor de Cadena a la derecha después de haber realizado su selección, para incluir el texto que le gustaría que se mostrara a su usuario cuando la alerta emergente solicite permisos.
fuente
Para pedir permiso para la aplicación de fotos, debe agregar este código (Swift 3) :
PHPhotoLibrary.requestAuthorization({ (newStatus) in if newStatus == PHAuthorizationStatus.authorized { /* do stuff here */ } })
fuente
<key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>
en el info.plistEscribí una extensión que tiene en cuenta todos los casos posibles:
onAccessHasBeenGranted
se ejecutará el código .requestAuthorization(_:)
se llamará.Ejemplo de uso:
PHPhotoLibrary.execute(controller: self, onAccessHasBeenGranted: { // access granted... })
Código de extensión:
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\"") } }) }
fuente
Excelente forma de implementar la sesión de cámara en Swift 5 , iOS 13
https://github.com/egzonpllana/CameraSession
Camera Session es una aplicación de iOS que intenta hacer la forma más sencilla posible de implementación de AVCaptureSession.
A través de la aplicación puedes encontrar estas sesiones de cámara implementadas:
La cámara personalizada cuenta con opciones como linterna y rotación de la cámara .
fuente