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

时间:2012-08-13 20:08:31

标签: objective-c macos cocoa

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

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

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

这里的问题是确保我的服务第一次安装我的应用程序的用户尽快出现的最佳方法。

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

如果我的应用程序通常只能通过上下文菜单访问,那么用户永远不会想到出去并首先启动应用程序。只有当上下文菜单不存在时,他们才会认为它已被破坏。

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

在以这种方式进行安装时是否有办法加快服务发现过程,以便用户没有新安装服务的任何时间段?

作为旁注,似乎问题可能不存在于10.8(或至少是如此)。 Apple可能会在最近的版本中更快地实现这种索引。

1 个答案:

答案 0 :(得分:2)

我实际上最终使用了

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.