Solicitar permiso para la cámara y la biblioteca en iOS 10 - Info.plist

84

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.

Alamri
fuente
1
@KiritModi Hola, muchas gracias. ¿Puede publicarlo como respuesta para que pueda aceptarlo?
Alamri
1
Oky ... lo haré ...
Kirit Modi
FYI: Los documentos de UIImagePickerController nunca se actualizaron para este requisito de iOS10 + (revisé todas las páginas, incluidos los documentos de Objective-C heredados)
benc

Respuestas:

104

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
Kirit Modi
fuente
Todavía soy nuevo en IOS, especialmente en sus idiomas nativos, Objective-c y Swift. Esto me salvó el día. Muchas gracias
Alamri
Hola, estoy teniendo problemas para que los usuarios de iPhone7 establezcan el permiso de la biblioteca de fotos. Cuando los usuarios de iPhone7 van a la configuración de mi aplicación en su teléfono, falta la opción de biblioteca de fotos. Tengo la clave: valor mencionado anteriormente en mi info.plist. La parte extraña es que todos los dispositivos con iOS 10 pueden ver esta opción, excepto los usuarios de iPhone7. iPhone6 ​​con iOS 10 puede ver esta opción, por ejemplo. ¿Me estoy perdiendo algo más?
DevKyle
1
No debe incluir PRODUCT_NAME en estos valores, ya que ya está incluido en el mensaje de Apple. Por ejemplo, "Nombre de la aplicación" le gustaría acceder a sus fotos
Harris
122

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.

George Vardikos
fuente
4
Gracias, esta respuesta me funcionó! Para las personas que usan Swift 4, la primera línea debe cambiarse a: "AVCaptureDevice.requestAccess (para: AVMediaType.video) {respuesta en".
Kevin
1
Gracias por esta respuesta. Funciona perfectamente. Sin embargo, me preguntaba una cosa al respecto. Cuando ejecuta requestAuthorization, ¿crea algún tipo de oyente que espera hasta que se establece el permiso antes de ejecutar su código? Al principio pensé que la ejecución del código simplemente se detuvo en PHPhotoLibrary.authorizationStatus, pero después de dejar caer un montón de declaraciones de impresión, parece que continúa.
George Kendros
4
Swift 3 : AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in. No olvides hacerlo import AVFoundation.
iurii
2
Gracias por la respuesta. Sin ella, mi aplicación fue rechazada porque la aplicación podía acceder a la biblioteca de fotos sin permiso.
Makalele
41

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>
Vishal Vaghasiya
fuente
27

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)
      }
    }
  }
Joel Teply
fuente
20

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>
Ed de la montaña
fuente
14

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.Permiso de cámara / biblioteca de fotos

elarcoiris
fuente
11

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 */ 
    } 
})
marcomoreira92
fuente
no te olvides de agregar <key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>en el info.plist
marcomoreira92
extraño, no tengo ningún problema. agregué este código en un botón y estoy usando mi iphone con iOS 10.3.1 para probar y funciona bien
marcomoreira92
3

Escribí una extensión que tiene en cuenta todos los casos posibles:

  • Si se permite el acceso, onAccessHasBeenGrantedse ejecutará el código .
  • Si no se determina el acceso, requestAuthorization(_:)se llamará.
  • Si el usuario ha denegado el acceso a la biblioteca de fotos de su aplicación, se le mostrará una ventana que le ofrece ir a la configuración y permitir el acceso. En esta ventana, los botones "Cancelar" y "Configuración" estarán disponibles para él. Cuando presiona el botón "configuración", se abrirá la configuración de la aplicación.

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\"")
      }
   })
}
dronpop
fuente
0

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:

  • Cámara nativa para tomar una foto o grabar un video.
  • Forma nativa de importar fotos y videos.
  • La forma personalizada de seleccionar activos como fotos y videos, con la opción de seleccionar uno o más activos de la Biblioteca.
  • Cámara personalizada para tomar una (s) foto (s) o video (s), con opciones para mantener presionado el botón y grabar.
  • Solicitudes de permiso de cámara separadas.

La cámara personalizada cuenta con opciones como linterna y rotación de la cámara .

Doci
fuente