我有一个macOS共享扩展,当用户在Safari中点击“共享”按钮时,它会被调用。我试图从-[NSExtensionItem attachments]
属性中获取页面的URL,但它是以NSSecureCoding
对象的形式出现的,我无法从中读取URL。
在loadView
方法中,我过滤并加载public.url
类型的附件:
override func loadView() {
super.loadView()
guard let inputItem = extensionContext?.inputItems.first as? NSExtensionItem else {
print("Didn't received input item from action.")
return
}
var itemProvider: NSItemProvider?
itemProvider = inputItem.attachments?.filter({ $0.registeredTypeIdentifiers.contains("public.url") }).first ?? inputItem.attachments?.filter({ $0.registeredTypeIdentifiers.contains("public.plain-text") }).first
guard let itemProvider = itemProvider else {
print("Didn't received attachments from input item.")
return
}
if itemProvider.canLoadObject(ofClass: URL.self) {
itemProvider.loadItem(forTypeIdentifier: "public.url", completionHandler: onLoadVideoURL)
} else if itemProvider.canLoadObject(ofClass: String.self) {
itemProvider.loadItem(forTypeIdentifier: "public.plain-text", completionHandler: onLoadVideoURL)
} else {
print("This action only supports URL and String.")
}
}
itemProvider.loadItem
方法会针对型别识别项public.url
执行,并呼叫下列的完成行程常式:
@objc private func onLoadVideoURL(dict: NSSecureCoding?, error: Error?) {
print("URL: \(dict.debugDescription)")
// ...
}
但它打印到控制台的内容是:
URL: Optional(<68747470 733a2f2f 73746163 6b6f7665 72666c6f 772e636f 6d2f7175 65737469 6f6e732f 35323231 39373030 2f686f77 2d746f2d 63617374 2d6e7373 65637572 65636f64 696e672d 746f2d6d 6b6d6170 6974656d 2d696e2d 61637469 6f6e2d65 7874656e 73696f6e>)
相同的代码在iOS上按预期工作,将共享的URL打印到控制台。
我是否需要以某种方式将NSSecureCoding
转换为URL
或其他对象?或者我是否应该在macOS上以完全不同的方式进行转换?目标是从用户在共享菜单中选择时激活的共享扩展访问页面的URL。
2条答案
按热度按时间xqkwcwgp1#
原来
NSSecureCoding
的内容是URL,但是是十六进制的。下面是我将其转换为String的方法:第一个
7ivaypg92#
文档在这方面不是很好。你可以通过使用
loadObject
而不是loadItem
来提取URL(或任何类型),而不需要编写解码器。例如: