iOS 共享扩展无法处理照片库中的图像

问题描述

我在 Swift 4 中构建了一个共享扩展,我一直在努力让它能够接受所有类型的图像。出于某种原因,当我尝试从照片库共享时,它似乎只接受屏幕截图。没有其他图片最终会重定向到我的应用。

对于内容类型,我目前使用的是 kUTTypeData,但我也尝试过 kUTTypeImagekUTTypeJPEGkUTTypejpeg2000kUTTypePNG 和 {{ 1}}。

应用正确显示在共享列表中,因此 kUTTypeURL 似乎没有问题。

这是我的共享扩展代码

NSExtensionActivationRule

这是我当前的扩展名 PLIST 文件

import UIKit
import Social
import MobileCoreServices

class ShareViewController: SLComposeServiceViewController {
    
    let sharedKey = "ImageSharePhotoKey"
    var imagesData: [Data] = []
                
    override func viewDidLoad() {
        super.viewDidLoad()
        self.manageImages()
    }
    
    func redirectToHostApp(key: String) {
        let url = URL(string: "AppName://dataUrl=\(key)")
        var responder = self as UIResponder?
        let selectorOpenURL = sel_registerName("openURL:")
        
        while (responder != nil) {
            if (responder?.responds(to: selectorOpenURL))! {
                let _ = responder?.perform(selectorOpenURL,with: url)
            }
            responder = responder!.next
        }
        self.extensionContext!.completeRequest(returningItems: [],completionHandler: nil)
    }
    
    func manageImages() {
        let content = extensionContext!.inputItems[0] as! NSExtensionItem
        let contentType = kUTTypeData as String

        
        for (index,attachment) in (content.attachments!).enumerated() {
            if attachment.hasItemConformingToTypeIdentifier(contentType) {
                
                attachment.loadItem(forTypeIdentifier: contentType,options: nil) { [weak self] data,error in
                    if error == nil,let this = self {
                        var contentData: Data? = nil

                        //data Could be raw Data
                        if let data = data as? Data {
                            contentData = data

                        //data Could be an URL
                        } else if let url = data as? URL {
                            contentData = try? Data(contentsOf: url)
                        }

                        //data Could be an UIImage object (e.g. ios11 screenshot editor)
                        else if let imageData = data as? UIImage {
                            contentData = imageData.pngData()
                        
                        }

                        // proceed here with contentData
                        let rawImage = UIImage(data: contentData ?? Data())
                        
                        // CONVERTED INTO FORMATTED FILE : OVER COME MEMORY WARNING
                        // YOU USE SCALE PROPERTY ALSO TO REDUCE IMAGE SIZE
                        let image = UIImage.resizeImage(image: rawImage!,width: rawImage?.size.width ?? 0,height: rawImage?.size.height ?? 0)
                        let imgData = image.pngData()
                        
                        this.imagesData.append(imgData!)
                        
                        if index == (content.attachments?.count)! - 1 {
                            dispatchQueue.main.async {
                                let userDefaults = UserDefaults(suiteName: "group.com.myName.AppName")
                                userDefaults?.set(this.imagesData,forKey: this.sharedKey)
                                userDefaults?.synchronize()
                                
                                self?.redirectToHostApp(key: this.sharedKey)
                            }
                        }
                    }
                }
            }
        }
    }
        
    override func isContentValid() -> Bool {
        return true
    }

    override func didSelectPost() {
    }

    override func configurationItems() -> [Any]! {
        return []
    }

}

extension UIImage {
    class func resizeImage(image: UIImage,width: CGFloat,height: CGFloat) -> UIImage {
        UIGraphicsBeginImageContext(CGSize(width: width,height: height))
        image.draw(in: CGRect(x: 0,y: 0,width: width,height: height))
        let newImage = UIGraphicsGetimageFromCurrentimageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }
}

对于如何让它接受所有格式的图像的任何建议或帮助将不胜感激!

解决方法

尝试使用 kUTTypeFileURL。如果您的应用程序根本没有出现在共享表中,那么问题可能与 NSExtensionActivationRule 相关,您可以通过使用 NSExtensionActivationRule 值作为 TRUEPREDICATE 来排除该问题。通过查看 NSExtensionActivationRule 值,我没有发现任何问题。

尝试使用kUTTypeFileURL,如果这不起作用,请在共享图像时调试并找到attachment.registeredTypeIdentifiers 值。您可以尝试其中一个值。

在加载 attachment.registeredTypeIdentifiers 之前检查 attachment.loadItem(forTypeIdentifier: contentType,options: nil)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...