如何通过 macOS 上的分享按钮获取页面 URL 分享?
How to get the page URL shared via the Share button on macOS?
当用户点击 Safari 中的“共享”按钮时,我调用了一个 macOS 共享扩展。我正在尝试从 -[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({ [=11=].registeredTypeIdentifiers.contains("public.url") }).first ?? inputItem.attachments?.filter({ [=11=].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。
原来 NSSecureCoding
的内容是 URL,但是是十六进制的。以下是我将其转换为字符串的方式:
let urlHex = dict.debugDescription
.replacingOccurrences(of: "Optional(", with: "")
.replacingOccurrences(of: ")", with: "")
.replacingOccurrences(of: "<", with: "")
.replacingOccurrences(of: ">", with: "")
.replacingOccurrences(of: " ", with: "")
guard let urlHexData = Data(fromHexEncodedString: urlHex) else { return }
guard let url = String(data: urlHexData, encoding: .utf8) else { return }
extension Data {
// From
init?(fromHexEncodedString string: String) {
func decodeNibble(u: UInt16) -> UInt8? {
switch(u) {
case 0x30 ... 0x39:
return UInt8(u - 0x30)
case 0x41 ... 0x46:
return UInt8(u - 0x41 + 10)
case 0x61 ... 0x66:
return UInt8(u - 0x61 + 10)
default:
return nil
}
}
self.init(capacity: string.utf16.count/2)
var even = true
var byte: UInt8 = 0
for c in string.utf16 {
guard let val = decodeNibble(u: c) else { return nil }
if even {
byte = val << 4
} else {
byte += val
self.append(byte)
}
even = !even
}
guard even else { return nil }
}
}
当用户点击 Safari 中的“共享”按钮时,我调用了一个 macOS 共享扩展。我正在尝试从 -[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({ [=11=].registeredTypeIdentifiers.contains("public.url") }).first ?? inputItem.attachments?.filter({ [=11=].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。
原来 NSSecureCoding
的内容是 URL,但是是十六进制的。以下是我将其转换为字符串的方式:
let urlHex = dict.debugDescription
.replacingOccurrences(of: "Optional(", with: "")
.replacingOccurrences(of: ")", with: "")
.replacingOccurrences(of: "<", with: "")
.replacingOccurrences(of: ">", with: "")
.replacingOccurrences(of: " ", with: "")
guard let urlHexData = Data(fromHexEncodedString: urlHex) else { return }
guard let url = String(data: urlHexData, encoding: .utf8) else { return }
extension Data {
// From
init?(fromHexEncodedString string: String) {
func decodeNibble(u: UInt16) -> UInt8? {
switch(u) {
case 0x30 ... 0x39:
return UInt8(u - 0x30)
case 0x41 ... 0x46:
return UInt8(u - 0x41 + 10)
case 0x61 ... 0x66:
return UInt8(u - 0x61 + 10)
default:
return nil
}
}
self.init(capacity: string.utf16.count/2)
var even = true
var byte: UInt8 = 0
for c in string.utf16 {
guard let val = decodeNibble(u: c) else { return nil }
if even {
byte = val << 4
} else {
byte += val
self.append(byte)
}
even = !even
}
guard even else { return nil }
}
}