使用新服务项更新 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 右键单击上下文菜单的主要内容,如果未能解决你的问题,请参考以下文章
使用 ToolsAPI 将菜单项添加到 Delphi IDE 中单元的选项卡上下文菜单