1

我的 iOS 应用程序 (Swift 3) 需要使用操作扩展从其他应用程序获取重要图像。我正在使用标准的操作扩展模板代码,它适用于 iOS 邮件和照片等应用程序,其中共享的图像是本地文件的 URL。但是对于某些共享图像是实际图像数据本身的应用程序,我的操作扩展代码没有获取图像。

  for item: Any in self.extensionContext!.inputItems {
        let inputItem = item as! NSExtensionItem
        for provider: Any in inputItem.attachments! {

            let itemProvider = provider as! NSItemProvider

            if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) {  //we'll take any image type: gif, png, jpg, etc

        // This is an image. We'll load it, then place it in our image view.
        weak var weakImageView = self.imageView
        itemProvider.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil, completionHandler: { (imageURL,

            error) in
            OperationQueue.main.addOperation {


                if let strongImageView = weakImageView {


                    if let imageURL = imageURL as? NSURL {

                        strongImageView.image = UIImage(data: NSData(contentsOf: imageURL as URL)! as Data)

                        let imageData = NSData(contentsOf: imageURL as URL)! as Data
                        self.gifImageView.image = UIImage.gif(data: imageData)

                        let width = strongImageView.image?.size.width
                        let height = strongImageView.image?.size.height
                        ....  my custom logic

                   }
              }  

作为参考,我联系了开发人员以获取其中一个无法正常工作的应用程序,他分享了这段代码,说明了他如何将图像共享到操作扩展。

//Here is the relevant code. At this point the scaledImage variable holds a UIImage. 

var activityItems = Array<Any?>()

if let pngData = UIImagePNGRepresentation(scaledImage) {

    activityItems.append(pngData)

} else {

    activityItems.append(scaledImage)
}

//Then a little later it presents the share sheet:

let activityVC = UIActivityViewController(activityItems: activityItems,applicationActivities: [])

self.present(activityVC, animated: true, completion: nil)              
4

1 回答 1

1

感谢这篇文章很好地解释了挑战https://pspdfkit.com/blog/2017/action-extension/。总之,我们不知道共享应用程序是给我们一个现有图像的 URL 还是只是原始图像数据,所以我们需要修改开箱即用的操作扩展模板代码来处理这两种情况。

for item: Any in self.extensionContext!.inputItems {
    let inputItem = item as! NSExtensionItem
    for provider: Any in inputItem.attachments! {

        let itemProvider = provider as! NSItemProvider

        if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) {  //we'll take any image type: gif, png, jpg, etc

    // This is an image. We'll load it, then place it in our image view.
    weak var weakImageView = self.imageView
    itemProvider.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil, completionHandler: { (imageURL,

        error) in
        OperationQueue.main.addOperation {


            if let strongImageView = weakImageView {


                if let imageURL = imageURL as? NSURL {

                    strongImageView.image = UIImage(data: NSData(contentsOf: imageURL as URL)! as Data)

                    let imageData = NSData(contentsOf: imageURL as URL)! as Data
                    self.gifImageView.image = UIImage.gif(data: imageData)

                    let width = strongImageView.image?.size.width
                    let height = strongImageView.image?.size.height
                    ....  my custom logic

               }

               else 

                    guard let imageData = imageURL as? Data else { return } //can we cast to image data?
                    strongImageView_.image = UIImage(data: imageData_)

                    //custom logic

          }  
于 2017-02-16T03:57:25.093 回答