使用新服务项更新 OSX 右键单击​​上下文菜单

Posted

技术标签:

【中文标题】使用新服务项更新 OSX 右键单击​​上下文菜单【英文标题】:Updating OSX right click context menu with new service item 【发布时间】:2012-08-13 20:08:30 【问题描述】:

我创建了一个应用程序,通过在我的应用程序 info.plist 中添加一个 NSService 条目(如http://www.macosxautomation.com/services/learn/),为某些文件公开 OSX 服务,但我发现在新机器上安装我的应用程序时,该服务不会'在查找器右键单击上下文菜单中不会快速显示。

我知道这是因为粘贴板服务没有重新索引 /Applications 文件夹并“发现”新安装的服务。

我也知道我可以通过手动运行 /System/Library/CoreServices/pbs 来强制重新索引和发现。

这里的问题是,对于第一次安装我的应用程序的用户来说,确保我的服务尽快出现的最佳方式是什么。

我可以在我的应用程序启动时对“/System/Library/CoreServices/pbs”执行系统调用——如果用户立即启动我的应用程序——但这只能部分解决问题(另外我想知道是否有一种更好的基于 Cocoa API 的方法)。

如果我的应用程序通常只能通过上下文菜单访问,那么用户一开始就不会想到出去启动应用程序。当上下文菜单不存在时,他们只会认为它已损坏。

我没有通过安装程序分发我的应用程序。我只是提供一个可以拖放到 /Applications 的包(我相信 Apple 通常会建议)。

有没有办法在以这种方式进行安装时加快服务发现的过程,这样用户就不会有一段时间没有新安装的服务?

附带说明,该问题似乎在 10.8 中可能不存在(或至少不明显)。 Apple 可能在其最新版本中更快地实现了这种索引。

【问题讨论】:

【参考方案1】:

我实际上已经使用了

system("killall pbs;/System/Library/CoreServices/pbs -flush");

正如您所描述的,在我的一个应用程序中,虽然那是很久以前的事了,当时 10.5 也是有问题的。

不过,您可能想试试这个功能:

void NSUpdateDynamicServices(void)

根据文档,它的作用就像冲洗 pbs,但是是一种更清洁的解决方案。

另外,如果(根据您的描述)该应用只是一项服务,请考虑将其设为一项真正的服务 - 请参阅 (Installing the Service)

To build a standalone service, use the extension .service and store it in Library/Services.

【讨论】:

谢谢,调用 NSUpdateDynamicServices() 听起来确实比运行脚本刷新 pbs 更好。这样就解决了一半的问题(因为我可以在应用程序启动时运行它),但至于仅通过服务菜单访问应用程序时如何实现这一点仍然是个谜。我实际上怀疑在这一点上是否有答案。 我认为这是正确的答案。我怀疑有没有更好的,即使感觉不完整。感谢您花时间回答。

以上是关于使用新服务项更新 OSX 右键单击​​上下文菜单的主要内容,如果未能解决你的问题,请参考以下文章

Pyqt5右键单击并在新选项卡中打开

如何在 Java Swing 中创建右键单击上下文菜单?

使用 ToolsAPI 将菜单项添加到 Delphi IDE 中单元的选项卡上下文菜单

Cocoa osx:为所有正在运行的应用程序在停靠元素上添加一个菜单项

“转到类型定义”上下文菜单项在哪里?

如何在 Chrome 的信息亭模式下禁用右键单击/长按的上下文菜单?