【问题标题】:NSSharingService.perform() with Send To PhotosNSSharingService.perform() 与发送到照片
【发布时间】: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

标签: swift macos share photo


【解决方案1】:

所以我无法找到错误,但我设法解决了问题。我在我的 func openSharingService() 中添加了以下代码,以便识别添加到照片并以不同的方式处理它:

if ( (service == NSSharingService(named: .addToIPhoto)) && (self.provider!.hasItemConformingToTypeIdentifier("public.png")) ) {
        self.provider!.loadObject(ofClass: NSURL.self, completionHandler: {(val, error) in
            //print(val)
            DispatchQueue.main.async {
                let u = val as! NSURL
                self.photosHandler(u)
                NSWorkspace.shared.launchApplication("Photos")
            }
        })
    }

self.photosHandler 是从我的催化剂应用程序包中填充的回调,它使用 PHPhotoLibrary 添加照片:

PHPhotoLibrary.requestAuthorization(for: .addOnly, handler: self.OnAuthorizationDone)

(OnAuthorizationDone() 也必须使用PHPhotoLibrary.shared().performChanges()PHAssetChangeRequest.creationRequestForAssetFromImage() 来实现)

【讨论】:

    猜你喜欢
    • 2018-11-12
    • 2020-05-06
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2011-12-21
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多