【问题标题】:Picker Error Message on Exit (encountered while discovering extensions: Error Domain=PlugInKit Code=13) With Swift 4 - Xcode 9使用 Swift 4 - Xcode 9 退出时选择器错误消息(在发现扩展时遇到:错误域 = PlugInKit 代码 = 13)
【发布时间】:2018-03-18 10:31:29
【问题描述】:

类似于

PhotoPicker discovery error: Error Domain=PlugInKit Code=13

还有

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

但是我已经尝试了所有这些建议,但调试日志中仍然出现错误。运行 Swift 4 XCode 9A235

各个地方的建议是......

  • 有人说加@objc
  • 有人说添加内部
  • 有些人建议添加 _ 并确保使用 Any 而不是 任何对象
  • 有人说使用didFinishPickingImageWithInfo(返回 我没有图片)
  • 有人说dismss the picker,其他人说dismiss self,其他人 说解雇两个
  • 有人说将“隐私...”添加到 plist(完成)
  • 添加了导入照片
  • 添加了强制 PHPhotoLibrary.requestAuthorization() { (状态)-> 无效...

我在 Swift 3 - 以前的 xcode 中没有遇到这个问题。 但是对于 Swift 4,我尝试了所有我看到的建议,但我仍然收到以下错误

发现扩展时遇到[discovery] 错误:Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}

选择器工作正常,我最终会从照片中选择图像,但每次在选择器退出(取消或选择)时都会收到此错误消息...

任何建议如何停止错误消息?除了其他两个链接提供的东西列表(上面总结)

我的方法

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

    imageSelected = nil

    if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
        imageSelected = editedImage
    } else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
        imageSelected = originalImage
    }

    if  imageSelected != nil {
        handleSelectedImage()   // override in subclass to do something with the returned image
    }
    picker.dismiss(animated: true, completion: nil)   // mess of calling both dismiss to see if it helps - it does not
    dismiss(animated: true, completion: nil)
}

【问题讨论】:

    标签: uiimagepickercontroller swift4


    【解决方案1】:
    1. 将“隐私...”添加到 plist
    2. 从 Xcode 菜单打开:产品 > 方案 > 编辑方案 > 在您的环境变量中设置 OS_ACTIVITY_MODE 的值设置为禁用

    见mc-system-group-container-and-mc-reading-from-public-effective-user-settings-err

    工作对我来说很好

    编辑

    如果它可以在我的代码下方提供帮助(使用 xcode 9)

    if libraryAuthorization == .authorized {
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
            imagePicker.allowsEditing = false
            imagePicker.view.tag = button.tag
            self.present(imagePicker, animated: true, completion: nil)
        }
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let pickerImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            photoContainer.addImageToButton(pickerImage, buttonTag: picker.view.tag)
            dismiss(animated: true)
        }
    }
    

    【讨论】:

    • 我们也可以有一个objective-c版本吗?
    • 您能解释一下这是做什么的或为什么有效吗?在不了解其含义的情况下,我很犹豫是否要添加设置。非常感谢,看来这个答案对某些人来说效果很好! (虽然不是全部)
    • 经过一番搜索,似乎这禁用了日志记录。在我的书中隐藏消息不是解决方法。
    • 禁用OS_ACTIVITY_MODE 听起来像是假装问题不存在并希望得到最好的结果。我永远不会推荐这个
    【解决方案2】:

    对于 Swift 4:

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        guard let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else {
            return
        }
        ...
    }
    
    • 在方法参数上,从[String: Any]更改为[UIImagePickerController.InfoKey : Any]
    • 在选取的图像上,将info["UIImagePickerControllerOriginalImage"] 更改为info[UIImagePickerController.InfoKey.originalImage]

    【讨论】:

    • 这绝对是帮助我的一个。原始的 imagePickerController didFinishPickingImage 委托方法从未被调用 - 必须更新为新的委托方法。
    【解决方案3】:

    这是因为您的应用使用照片库(在本例中使用 UIImagePickerController)而未请求用户许可。例如,如果我想在点击添加按钮时显示图像选择器:

    @IBAction func addButtonTapped(_ sender: UIBarButtonItem) {
        checkPermission {
            let picker = UIImagePickerController()
            picker.sourceType = .photoLibrary
            picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
    
            picker.delegate = self
            picker.allowsEditing = false
            self.present(picker, animated: true, completion: nil)
        }
    }
    
    func checkPermission(hanler: @escaping () -> Void) {
        let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
        switch photoAuthorizationStatus {
        case .authorized:
            // Access is already granted by user
            hanler()
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization { (newStatus) in
                if newStatus == PHAuthorizationStatus.authorized {
                    // Access is granted by user
                    hanler()
                }
            }
        default:
            print("Error: no access to photo album.")
        }
    }
    

    此外,还需要将此添加到您的 plist 中:

    <key>NSPhotoLibraryUsageDescription</key>
    <string>So that you can add images for your cloth. </string>
    

    这是权限对话框中显示的消息。

    【讨论】:

    • 哇,谢谢,这修复了我的错误!我只有 NSPhotoLibraryUsageDescription ......很奇怪,很难调试这个!
    【解决方案4】:

    我遇到了同样的问题,并尝试了我能找到的所有解决方案,但没有任何帮助。只是问自己如果不触发代理会发生什么情况:代理的释放!

    这就是我的情况!当呈现 UIImagePickerController 我的 class ImagePickerController : NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate 实例时 它不是当前的视图控制器,将被直接释放。当然不能再执行委托函数了。

    只需在 deinit(或 Objective-C 世界中的 dealloc)中放置一个断点,然后查看您的委托是否正在被释放。

    【讨论】:

      【解决方案5】:

      用户问:“*任何建议如何停止错误消息?除了其他两个链接提供的东西列表(上面总结)”。

      我使用了两个步骤来消除错误消息。 感谢Antoine Richeux上面的人https://stackoverflow.com/users/5767821/antoine-richeux。
      我认为在 pList 中添加隐私可能没有必要,至少在我的情况下

      第 1 步。 从菜单栏中选择:产品 > 方案 > 编辑方案 从 Build, Run ... Archive 的左侧列表中选择 Run 从右侧的顶部选项集中选择参数 - 参见附图。 使用环境变量下的 + 按钮添加新条目 名称:OS_ACTIVITY_MODE 值:禁用

      This shows where to add the environment variable

      第 2 步。 清理项目并重建

      【讨论】:

        【解决方案6】:

        确保你声明你的类实现了UINavigationControllerDelegate。

        extension MyViewController: UINavigationControllerDelegate {}
        

        出于某种原因,在 Xcode 9.0 中它警告我要这样声明委托:

        imagePicker.delegate = self as? UIImagePickerControllerDelegate & UINavigationControllerDelegate
        

        【讨论】:

        • 完成此操作并实施协议,否则我将无法获得所选图像。仍然出现此错误。
        • 试过 ... imagePicker.delegate = self as UIImagePickerControllerDelegate & UINavigationControllerDelegate .. 仍然得到错误。只是在做=自我。但没有区别
        • 对不起,我还是会收到日志消息,这个解决方案实际上是如果您无法接收到图像选择的委托方法。我假设日志消息只是一个 xcode 错误,最终会被修复。
        【解决方案7】:

        你可以试试吗?

        extension YourProfileViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        
            func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
                dismiss(animated: true, completion: nil)
            }
        
            func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
                log.debug("Called imagePickerController function ")
                let image = info[UIImagePickerControllerOriginalImage] as? UIImage
                self.dismiss(animated: true) {
                    self.yourProfileImageView.image = image
                }
            }
        }
        

        【讨论】:

          【解决方案8】:

          我也有这个问题。这很烦人,因为出现控制台错误但应用程序仍在加载图像。我请求了授权状态,将我的密钥添加到 .plst 中,但发现这些都无法完成工作。

          一旦我进入 Product -> Scheme -> Edit Scheme -> Run 然后添加键:“OS_ACTIVITY_MODE” 值:“disable “,清理并重建......错误消失了。

          【讨论】:

          • 这个对我有用。它只发生在模拟器中,但我仍然能够获得图像。
          【解决方案9】:

          在 Swift 4.2 和 Xcode 10.0 上遇到了同样的问题。尽管图像选择器工作正常,但 Xcode 在控制台上显示此错误。要摆脱这个:

          • 在 Xcode 菜单产品 > 方案 > 编辑方案上
          • 选择“运行”选项卡,然后选择“参数”
          • 在“环境变量”部分添加一个名称为 OS_ACTIVITY_MODE 和值 disable 的变量

          【讨论】:

          • 这只是隐藏了日志中的消息。
          【解决方案10】:
          var messageImage = UIImage()
          
              @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
                  self.dismiss(animated: true, completion: { () -> Void in
          
                  })
                  if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
                  {
                      messageImage = image
          
                  }
                  print("Image Captured")
              }
          

          您需要获取UIImagePickerController.InfoKey.originalImage 而不是UIImagePickerController.InfoKey.editedImage

          【讨论】:

            猜你喜欢
            • 2017-11-11
            • 1970-01-01
            • 2020-03-19
            • 2014-09-13
            • 2018-09-18
            • 2011-11-05
            • 1970-01-01
            • 2013-09-28
            • 1970-01-01
            相关资源
            最近更新 更多