Error de descubrimiento de PhotoPicker: Dominio de error = Código PlugInKit = 13

Intento mostrar una imagen de la biblioteca de fotos en UIImageView

El error completo es:

2017-06-09 21: 55: 59.063307 + 0200 firstapp2.0 [12873: 1120778] Error de descubrimiento de PhotoPicker: Dominio de error = Código de PlugInKit = 13 “consulta cancelada” UserInfo = {NSLocalizedDescription = consulta cancelada}

Mi código está incluido a continuación:

import UIKit class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate{ @IBOutlet weak var pic: UIImageView! @IBOutlet weak var text: UILabel! var chosenImage : UIImage! override func viewDidLoad() { super.viewDidLoad() pic.isUserInteractionEnabled = true; } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [AnyHashable: Any]) { var chosenImage = info[UIImagePickerControllerEditedImage] self.pic!.image = chosenImage as! UIImage picker.dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) } @IBAction func tap(_ sender: Any) { self.text.text = "Kreason" let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary imagePicker.allowsEditing = false self.present(imagePicker, animated: true, completion: nil) } } 

Necesita hacer una referencia explícita de Objective-C: @objc

 @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage image = chosenImage self.performSegue(withIdentifier: "ShowEditView", sender: self) dismiss(animated: true, completion: nil) } 

¡Lo encontré! Está intentando decirle que no tiene autorización para “fotos”. Debe incluir el #import y solicitar autorización, por ejemplo, en Objective-C.

Espero que esto te ahorre algo de tiempo. Pasé dos días completos depurando esto!

 [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { switch (status) { case PHAuthorizationStatusAuthorized: NSLog(@"PHAuthorizationStatusAuthorized"); break; case PHAuthorizationStatusDenied: NSLog(@"PHAuthorizationStatusDenied"); break; case PHAuthorizationStatusNotDetermined: NSLog(@"PHAuthorizationStatusNotDetermined"); break; case PHAuthorizationStatusRestricted: NSLog(@"PHAuthorizationStatusRestricted"); break; } }]; 

Estoy seguro de que alguien puede decirle cómo hacer lo mismo en Swift.

Si no lo has hecho, intenta esto .

Producto> Esquema> Editar esquema> Variables de entorno OS_ACTIVITY_MODE: disable

Soluciona mi problema.

Intenté algunas de las respuestas combinadas sin mucho éxito.

Utilizando Swift 4, descubrí que necesitaba asegurarme de que los siguientes dos elementos se implementaran para garantizar que la imagen se seleccionara y se colocara en el selector (tenga en cuenta que los “descubrimientos” errores encontrados al descubrir extensiones:

Dominio de error = Código PlugInKit = 13 “consulta cancelada” UserInfo = {NSLocalizedDescription = consulta cancelada} ”

el mensaje todavía se muestra en la consola, pero no evita que agregue una imagen). ¿Tal vez este es un mensaje que resulta en el despido del selector?

1) El delegado para el UIImagePickerController es (UIImagePickerControllerDelegate & UINavigationControllerDelegate)? así que es necesario agregar explícitamente UINavigationControllerDelegate como uno de los protocolos:

 class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { .... }. 

2) Asegúrese de que el info.plist tenga la Privacy - Photo library Usage Description clave de Privacy - Photo library Usage Description y el valor de cadena establecidos.

Por supuesto, debe asegurarse de crear un UIImagePickerController y establecer su delegado igual a self en ViewDidLoad() :

 class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { let imagePickerController = UIImagePickerController() override func viewDidLoad() { super.viewDidLoad() imagePickerController.delegate = self } ... } 

Solucioné este problema, llame a la función a continuación en viewdidload o viewWillAppear o viewDidAppear para verificar el permiso de su aplicación.

 func checkPermission() { let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus() switch photoAuthorizationStatus { case .authorized: print("Access is granted by user") case .notDetermined: PHPhotoLibrary.requestAuthorization({ (newStatus) in print("status is \(newStatus)") if newStatus == PHAuthorizationStatus.authorized { /* do stuff here */ print("success") } }) print("It is not determined until now") case .restricted: // same same print("User do not have access to photo album.") case .denied: // same same print("User has denied the permission.") } } 

Y para usar el método anterior, no te olvides de agregar import Photos en la parte superior de la clase.

Encontré esta solución. Obtuvimos este error debido a estas dos razones que se mencionan a continuación.

  1. Primero debemos llamar a este método para obtener autorización

Código de Autorización

 func checkPermission() { let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus() switch photoAuthorizationStatus { case .authorized: print("Access is granted by user") case .notDetermined: PHPhotoLibrary.requestAuthorization({ (newStatus) in print("status is \(newStatus)") if newStatus == PHAuthorizationStatus.authorized { / do stuff here */ print("success") } }) case .restricted: / print("User do not have access to photo album.") case .denied: / print("User has denied the permission.") } } 
  1. didFinishPickingMediaWithInfo correcta del método Llamada de didFinishPickingMediaWithInfo

Incorrecto:

 private func imagePickerController( picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { } 

Derecha

 @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { } 

Espero que esta solución te ayude a resolver este error.

Si funciona para usted, no olvide marcarlo como correcto, de modo que esto ayudará a otros a encontrar la forma correcta.

Esta podría no ser la respuesta más útil, pero espero que ayude. Estoy 99% seguro de que este mensaje de error en particular no te señala el problema real. Pasé horas tirando de mi pelo sobre este mismo problema exacto.

1) Tenía autorización para imprimir fotos en la consola cuando lanzaba mi selector, 2) Podía navegar y elegir una foto con la suficiente facilidad, y 3) cuando me devolvía a mi punto de vista al descartar el selector, la imagen de mi botón no se actualizó con la nueva foto … y la única pista que tuve para el problema fue exactamente el mismo mensaje de error que está recibiendo.

Resulta que estaba codificando una imagen de marcador de posición en ViewWillAppear en lugar de ViewDidLoad. Cada vez que el selector estaba descartando, llamaba a ViewWillAppear y reemplazaba mi imagen elegida con mi imagen codificada. Solucioné ese problema y, efectivamente, todo funciona bien ahora … y sigo viendo ese mensaje de error cada vez que regreso del selector.

Recomiendo buscar otro lugar que no sea el ImagePicker para su problema y es probable que lo encuentre.

* Falta DELEGATE * en Swift 3

En mi caso, todas las configuraciones fueron correctas:
1 – Delegados (UIImagePickerControllerDelegate, UINavigationControllerDelegate);
2 – Permisos ya verificados;
3 – Plist ya hecho;
4 – Todo lo que se lee en estas Respuestas, lo hice;

Pero me olvidé de implementar pickerview.delegate = self en viewDidLoad porque copio y pego desde mi otro ViewController y lo olvido!

Espero que ayude a alguien, ¡revise primero su COPIA / PASTA!

Asegúrese de estar UIImagePickerControllerDelegate, UINavigationControllerDelegate ambos: UIImagePickerControllerDelegate, UINavigationControllerDelegate .

Además, recuerde configurar el delegado:

 let picker = UIImagePickerController() picker.allowsEditing = true picker.sourceType = .photoLibrary picker.delegate = self //Don't forget this line! self.present(picker, animated: true, completion: nil) 

Créditos a esta fuente .

Esto soluciona el problema en Swift 4:

Cambiar el código a continuación

 func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {} 

a esto:

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {} 

Asegúrese de agregar internal func al principio y luego agregue la minúscula después del paréntesis ( _ picker: UIImagePickerController… y luego cambie de AnyObject a Any ] …
Verifique el código a continuación:

 internal func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { userPhoto.image = pickedImage } self.dismiss(animated: true, completion: nil) } 

Esto resolvió mi error:

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage addPhotoBtn.setImage(pickedImage, for: .normal) dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { dismiss(animated: true, completion: nil) } 

Por favor verifique por los pasos de la siguiente manera:

  1. Importar fotos
  2. Tiene acceso al álbum:

     func authorizeToAlbum(completion:@escaping (Bool)->Void) { if PHPhotoLibrary.authorizationStatus() != .authorized { NSLog("Will request authorization") PHPhotoLibrary.requestAuthorization({ (status) in if status == .authorized { DispatchQueue.main.async(execute: { completion(true) }) } else { DispatchQueue.main.async(execute: { completion(false) }) } }) } else { DispatchQueue.main.async(execute: { completion(true) }) } } 
  3. Presente UIImagePickerController

     self.authorizeToAlbum { (authorized) in if authorized == true { let picker = UIImagePickerController() picker.delegate = self picker.allowsEditing = false picker.sourceType = .photoLibrary self.present(picker, animated: true, completion: nil) } } 
  4. El paso clave, asegúrese de que el método de delegado es como seguir estrictamente

     // MARK: - UIImagePickerControllerDelegate Methods func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { self.pickedImage = pickedImage if let finalImage = handleImage(originalImage: self.pickedImage!, maskImage: self.maskImage!) { self.imageView.image = finalImage } } dismiss(animated: true, completion: nil) } 

Esto me dejó perplejo, pero la respuesta en el siguiente enlace funcionó para mí. El error desapareció y la imagen se muestra como se esperaba

Al igual que una de las respuestas anteriores, debe tener (_ picker... pero también @objc antes de la función.

 @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) { ... } 

https://forums.developer.apple.com/thread/82105

En mi caso, recibí este error porque estaba presentando un controlador de selector de imágenes sin verificar primero si el usuario había permitido el acceso a las imágenes. En otra parte de mi código, el usuario me dio permiso, así que creo que todo lo que tenía que hacer era importar fotos. Sin embargo, dado que “pueden” no haber otorgado el permiso en ese momento en la aplicación, agregar esto justo antes de que presentara el controlador del selector de imágenes me solucionó el problema (importar fotos también).

 // request photos permission if permission has not been granted if PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.authorized { PHPhotoLibrary.requestAuthorization({ (status: PHAuthorizationStatus) in }) } 

Si esta respuesta parece redundante, mis disculpas, pero tuve que reconstruir algunas respuestas diferentes para que mi solución funcionara. Quizás esto ayude a alguien más a usar Swift 4.

El error también ocurre cuando no ha configurado los permisos de uso de la biblioteca de fotos en su archivo Info.plist .

Info.plist agregar Privacy - Photo Library Usage Description en Info.plist con una Cadena que aparecerá cuando su Aplicación intente por primera vez acceder a la Biblioteca de fotos del Usuario.

Los ajustes finales de Info.plist deberían verse más o menos así: enter image description here

Tengo el mismo error y lo solucioné de esta manera:

obtener objeto de imagen de manera diferente depende de UIImagePickerController allowsEditing es verdadero o falso

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if isImagePickerAllowEditing { sourceImage = info[UIImagePickerControllerEditedImage] as? UIImage } else { sourceImage = info[UIImagePickerControllerOriginalImage] as? UIImage } .... } 

Y por supuesto, solicite permiso para acceder a la biblioteca de fotos primero como se indica en los comentarios anteriores.

Esto es lo que hice y resolvió mi problema.

  • agregar @objc
  • agregar interno
  • agregar _ antes de imagePicker
  • asegúrese de estar utilizando Any y no AnyObject

¡Espero que esto ayude!

En mi extremo UINavigationControllerDelegate delegado UINavigationControllerDelegate .

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate

Me encontré con el mismo problema. Ninguna de las sugerencias mencionadas anteriormente funcionó para mí. Sin embargo, lo resolví, explicilty llamando al selector.descartar y descartar publicar eso. No tengo claro por qué he rechazado llamadas así, pero funcionó para mí.

  @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { print("Image picked") picker.dismiss(animated: true, completion: nil) dismiss(animated: true) { print("dismissed") self.delegate?.presentEditor(img: (info[UIImagePickerControllerOriginalImage] as? UIImage)!, id: self.id!) } } 

Leí todas estas respuestas y las modifiqué un poco aquí y no es necesario descartarlas, esto funcionó para mí, gracias a los demás que han respondido aquí.

  @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { print("########### media picked") picker.dismiss(animated: true, completion: nil) let img = (info[UIImagePickerControllerOriginalImage] as? UIImage)! //set img -picked image to "profileImage" UIimageView //use image here self.profileImage.image = img } } 

encontré la solución de IMage PickerView …..

 @IBOutlet weak var myImageView: UIImageView! var imagePicker = UIImagePickerController() @IBAction func selectImage(_ sender: Any) { let myPickerController = UIImagePickerController() myPickerController.delegate = self; myPickerController.sourceType = UIImagePickerControllerSourceType.photoLibrary self.present(myPickerController, animated: true, completion: nil) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { print(info) var selectedImageFromPicker: UIImage? if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage { selectedImageFromPicker = editedImage as! UIImage }else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage{ selectedImageFromPicker = originalImage as! UIImage } dismiss(animated: true, completion: nil) if var selectedImage = selectedImageFromPicker { myImageView.image = selectedImage } } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) } 

haga clic en imageView para cargar la imagen de la biblioteca de fotos y mostrar la vista previa en la misma imagen. en veloz 4

  let imagePicker = UIImagePickerController() @IBOutlet weak var userImage: UIImageView! override func viewDidLoad() { super.viewDidLoad() imagePicker.delegate = self let tap = UITapGestureRecognizer(target: self, action: #selector(SignUpViewController.click)) userImage.addGestureRecognizer(tap) userImage.isUserInteractionEnabled = true } @objc func click() { imagePicker.allowsEditing = false imagePicker.sourceType = .photoLibrary present(imagePicker, animated: true, completion: nil) } @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let chosenImage = info[UIImagePickerControllerOriginalImage] as? UIImage{ userImage.contentMode = .scaleAspectFit userImage.image = chosenImage } dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { dismiss(animated: true, completion: nil) } 

Recibí el mismo mensaje cuando estaba tratando de presentar otro controlador desde el selector de llamada imagePickerController . La solución que funcionó para mí fue mover mi código dentro de la callback de finalización desde el método de selección del selector

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { picker.dismiss(animated: true) { if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { let cropController:CropViewController = CropViewController(croppingStyle: .circular, image: pickedImage) cropController.delegate = self self.present(cropController, animated: true, completion: nil) } } } 

La solución que funcionó para mí fue simplemente ingresar al Producto (en la parte superior de la pantalla) -> Esquema -> Esquema de edición -> Argumentos

En Variables de entorno, agregue OS_ACTIVITY_MODE con un valor de “deshabilitar”

¡Espero que esto funcione para otra persona!

Adjuntaré una captura de pantalla por si mi descripción me parece confusa enter image description here

Para ocultar registros extraños de iOS

  1. abrir xcode
  2. cmd + shift + / para buscar el menú
  3. escriba “editar esquema”
  4. seleccionarlo e ingresar
  5. haga clic en “Argumentos”
  6. agregue una variable env: nombre es OS_ACTIVITY_MODE, el valor es deshabilitar
  7. cerca