PhotoPicker discovery error: Error Domain=PlugInKit Code=13

匿名 (未验证) 提交于 2019-12-03 08:30:34

问题:

I'm trying to display an image from the photo library in a UIImageView

The full error is:

2017-06-09 21:55:59.063307+0200 firstapp2.0[12873:1120778] PhotoPicker discovery error: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}

My code is included below:

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)     } } 

回答1:

You need to make explicit Objective-C reference: @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) } 


回答2:

I found it! It is trying to tell you that you do not have authorization to "photos" You need to include the #import and request authorization for example like this in Objective-C.

Hope this will save you some time. I spent two full days debugging this!

[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;     } }]; 

I am sure someone can tell you how to do the same in Swift.



回答3:

I fixed this issue, call function below into viewdidload or viewWillAppear or viewDidAppear to check permission for your app.

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.")         }     } 


回答4:

Tried a few of the combination responses without much success.

Using Swift 4, I found that I needed to make sure the following two items were implemented to ensure that the image was selected and placed into the picker (note that the "[discovery] errors encountered while discovering extensions:

Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}"

message still displays in the console, but it does not prevent you from adding an image). Maybe this is a message that results in the picker being dismissed?

1) The delegate for the UIImagePickerController is (UIImagePickerControllerDelegate & UINavigationControllerDelegate)? so need to explicitly add the UINavigationControllerDelegate as one of the protocols:

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

2) Make sure that the info.plist has the Privacy - Photo library Usage Description key and String value set.

Of course, you need to ensure that you create a UIImagePickerController and set its delegate equal to self in ViewDidLoad():

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


回答5:

If you have not done so, try this.

Product > Scheme > Edit Scheme > Environment Variables OS_ACTIVITY_MODE: disable

It solves my issue.



回答6:

I found this solution. We got this error due to these two reason which is mentioned below.

  1. First we need to call this method in for authorization

Authorization Code

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. Correct way of method Calling of didFinishPickingMediaWithInfo

Wrong:

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

Right

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

I hope this solution will help you out to resolve this error.

If it works for you don't forget to mark it's as a correct, so this will help to other to find the correct way.



回答7:

This might not be the most directly helpful answer - but hopefully it will help! I'm 99% sure that this particular error message isn't actually pointing you to the real problem. I spent hours pulling my hair out over this same exact issue.

1) I had authorization for photos printing to the console when I'd launch my picker, 2) I could navigate and pick a photo easy enough, and 3) when I would return me to my view upon dismissing the picker, my button image wasn't updated with the new photo... and the only hint that I had to the problem was the exact same error message that you are receiving.

Turns out I was hard-coding a placeholder image in ViewWillAppear instead of ViewDidLoad. Every time the picker was dismissing, it was calling ViewWillAppear and replacing my chosen image with my hard coded image. I fixed that issue and sure enough - everything is working fine now... and I'm still seeing that error message every time I return from the picker.

I recommend looking somewhere other than the ImagePicker for your problem and you'll likely find it.



回答8:

* Missing DELEGATE * in Swift 3

In my case, all settings was correct:
1 - Delegates ( UIImagePickerControllerDelegate,UINavigationControllerDelegate );
2 - Permissions already verified;
3 - Plist already done;
4 - Everything read on this Answers, i did;

But i forgot to implement pickerview.delegate = self on viewDidLoad Because i COPY and PASTE from my other viewController and forget that!

I hope it help somebody, review your COPY / PASTE first!!!



回答9:

Please check by steps as follow:

  1. Import Photos
  2. Has access to album:

    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. Present 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. The key step, make sure the delegate method is like following strictly

    // 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) } 


回答10:

Make sure you are subclassing both: UIImagePickerControllerDelegate, UINavigationControllerDelegate.

Also, remember to set the delegate:

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

Credits to this source.



回答11:

Make sure to add internal func at the beginning and then add the lower case after the parenthesis (_ picker: UIImagePickerController… and then change from AnyObject to Any]…
Check code below:

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) } 


回答12:

I have the same error and I fixed it in this way:

get image object in different way depends on UIImagePickerController allowsEditing is true or false

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

And of course, ask the permission to access photo library first as above comments.



回答13:

This solved my 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)  } 


回答14:

This is what I did and it solved my issue.

  • add @objc
  • add internal
  • add _ before imagePicker
  • make sure you are using Any and not AnyObject

Hope this helps!



回答15:

This had me stumped, but the answer at the link below worked for me. Error is gone and image displays as expected

Like one of the answers above, you have to have (_ picker... but also @objc before the function.

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

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



回答16:

I came across the same problem. None of the above mentioned suggestions worked for me. However, I resolved it, by explicilty calling the picker.dismiss and dismiss post that. I am not clear why I have make dismiss calls like that, but it worked for me.

   @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!)     }  } 


回答17:

The Error also happens when you have not configured the permissions of the usage of the Photo Library in you Info.plist file.

You need to add Privacy - Photo Library Usage Description in the Info.plist with a String that will appear when your App tries the first time to access the Photo Library of the User.

The final Info.plist adjustments should look something like this:



回答18:

I read the all these answers and little bit modified here and not needed to dismiss, this worked for me, Thanks others who have replied here.

    @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        }     } 


回答19:

i found the solution of 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)     } 


回答20:

click on imageView to load image from photo library and show preview on same imageview. on swift 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)             } 


回答21:

On my end UINavigationControllerDelegate delegate is missing.

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate



回答22:

In my case I was getting this error because I was presenting an image picker controller without first verifying if the user had allowed access to images. Elsewhere in my code the user had granted permission so I think all I needed to do was import Photos. However, since they 'may' not have granted permission at that point in the app adding this just before I presented the image picker controller solved the issue for me (import Photos as well).

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

If this answer seems redundant my apologies but I had to piece together from a few different answer to get my solution working. Perhaps this will help someone else using Swift 4.



回答23:

This fixes the issue in Swift 4:

Change the code below

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

to this:

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!