【发布时间】:2021-12-12 12:01:15
【问题描述】:
在 MacOS(催化剂应用程序,但 AppKit 捆绑包)上,我正在从菜单委托“即时”主应用程序菜单中创建共享子菜单,如下所示:
func menuWillOpen(_ menu: NSMenu) {
self.provider = NSItemProvider(contentsOf: url)! //url points to existing temporary file of type .png
menu.removeAllItems()
let srvcs = NSSharingService.sharingServices(forItems: [self.provider!])
for srv in srvcs {
let it = NSMenuItem(title: srv.menuItemTitle, action: #selector(openSharingService), keyEquivalent: "")
it.image = srv.image
it.representedObject = srv
it.target = self
menu.addItem(it)
}
}
@objc private func openSharingService(sender: NSMenuItem) {
let service = (sender.representedObject as! NSSharingService)
service.perform(withItems: [self.provider!])
}
它适用于任何共享类型,发送到照片除外。使用发送到照片时,我在控制台中收到此错误:
2021-10-27 08:59:02.042220+0200 Calculator2[14383:7732689] [xpc.exceptions] <NSXPCConnection: 0x6000008470c0> connection to service on pid 14388 named com.apple.share.System.add-to-iphoto.apple-extension-service: Exception caught during decoding of received selector _completeRequestReturningItems:forExtensionContextWithUUID:completion:, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSURL (0x7fff801889e8) [/System/Library/Frameworks/CoreFoundation.framework]'. Allowed classes are '{(
"NSDate (0x7fff80188600) [/System/Library/Frameworks/CoreFoundation.framework]",
"NSString (0x7fff801ba8d0) [/System/Library/Frameworks/Foundation.framework]",
"NSNumber (0x7fff801ba3a8) [/System/Library/Frameworks/Foundation.framework]",
"NSData (0x7fff801885d8) [/System/Library/Frameworks/CoreFoundation.framework]",
"NSDictionary (0x7fff80188650) [/System/Library/Frameworks/CoreFoundation.framework]",
"NSArray (0x7fff80188510) [/System/Library/Frameworks/CoreFoundation.framework]"
)}'.
照片应用程序已打开并添加了图像,但我的应用程序收到上述错误,并且它的菜单在重新启动之前都是灰色的。我在这里做错了吗?
编辑:我尝试像这样调用服务(通过 NSImage):
self.provider!.loadDataRepresentation(forTypeIdentifier: "public.png", completionHandler: {(data, error) in
let img = NSImage(data: data!)
DispatchQueue.main.async {
service.perform(withItems: [img])
}
})
... 它失败并出现完全相同的错误。再次抱怨 NSURL,即使我根本没有通过 NSURL。
【问题讨论】:
-
错误说明了一切。
-
@ElTomato 但我不明白。 NSSharingService.sharingServices(forItems: [self.provider!]) 提供了 Send To Photos 作为 this.provider 的服务,但是使用它失败了?并且无法在 png 图像上调用 Send To Photos 是否正常?当它实际上工作时(照片应用程序确实添加了图像),但也破坏了我的应用程序?
-
你听说过 Swift 中一种叫做“解包可选变量”的做法吗?
-
@ElTomato 我有,但你能告诉我你在哪里看到错误吗?
-
我不知道正确的解决方案是什么,但我可以对错误有所了解。当您拨打
NSSharingService.sharingServices(forItems: [self.provider!])时,您将收到NSSharingService。您会期望每个返回的NSSharingService都能够共享您提供的NSItemProvider,但似乎并非如此。在尝试NSSharingService.perform(withItems:)时,您正在调用一个库函数,该函数将 XPC 消息发送到com.apple.share.System.add-to-iphoto.apple-extension-service。如您所见,它没想到消息中有NSURL。