如何解决iOS 共享扩展无法处理照片库中的图像
我在 Swift 4 中构建了一个共享扩展,我一直在努力让它能够接受所有类型的图像。出于某种原因,当我尝试从照片库共享时,它似乎只接受屏幕截图。没有其他图片最终会重定向到我的应用。
对于内容类型,我目前使用的是 kUTTypeData
,但我也尝试过 kUTTypeImage
、kUTTypeJPEG
、kUTTypejpeg2000
、kUTTypePNG
和 {{ 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)
值
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。