我正在尝试使用BOOL NSPerformService(NSString *itemName, NSPasteboard *pboard);
API以编程方式调用Continuity Camera(Mac OS)服务,以便可以将功能挂在简单的按钮单击后面。需要作为itemName
参数传递的Continuity Camera服务的名称是什么?
我无法从com.apple.nsserivcescache.plist文件中找到服务的名称,尽管从上下文菜单中,服务的名称为“拍照”和“扫描文档”。我不确定这些名称是否会起作用,因为它们始终与设备的名称(iPhone | iPad)相关联。
我尝试过的东西。NSPerformSerice( @"Take Photo", [NSPasteboard generalPasteboard] );
NSPerformSerice( @"<Name of the iPhone> Take Photo", [NSPasteboard generalPasteboard] );
NSPerformSerice( @"<Name of the iPhone>/Take Photo", [NSPasteboard generalPasteboard] );
最佳答案
我写了一篇关于将Continuity Camera支持添加到您自己的应用程序中的简短文章:https://thomas.zoechling.me/journal/2018/10/Continuity.html
您必须实现NSServicesMenuRequestor
来指示可以处理剪贴板中的图像:
override func validRequestor(forSendType sendType: NSPasteboard.PasteboardType?, returnType: NSPasteboard.PasteboardType?) -> Any? {
if let pasteboardType = returnType,
NSImage.imageTypes.contains(pasteboardType.rawValue) {
return self
} else {
return super.validRequestor(forSendType: sendType, returnType: returnType)
}
}
通过实施上述方法,当前的第一响应者的菜单(例如按钮的菜单)将自动使用Continuity Camera菜单项进行填充。
该菜单中的项目将启动CC UI,然后在用户执行捕获时调用
readSelection(from: pasteboard)
。您可以从此处读取粘贴板内容:
func readSelection(from pasteboard: NSPasteboard) -> Bool {
guard pasteboard.canReadItem(withDataConformingToTypes: NSImage.imageTypes) else { return false }
guard let image = NSImage(pasteboard: pasteboard) else { return false }
self.imageView.image = image
return true
}
还应该可以控制与CC相关的菜单项的插入位置。有一个相关的
NSMenuItemImportFromDeviceIdentifier
常量,但是我还没有弄清楚如何使用它。 (此Twitter线程中的某些上下文:https://twitter.com/weichsel/status/1052980223891972096)