swift 如何通过macOS上的“共享”按钮共享页面URL?

d8tt03nd  于 2022-11-21  发布在  Swift
关注(0)|答案(2)|浏览(109)

我有一个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。

xqkwcwgp

xqkwcwgp1#

原来NSSecureCoding的内容是URL,但是是十六进制的。下面是我将其转换为String的方法:
第一个

7ivaypg9

7ivaypg92#

文档在这方面不是很好。你可以通过使用loadObject而不是loadItem来提取URL(或任何类型),而不需要编写解码器。
例如:

attachment.loadObject(ofClass: URL.self, completionHandler: { url, error in
  print(url)
})

相关问题