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

Joh*_*ers 5 macos cocoa objective-c

我已经通过在应用程序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可能在其最新版本中更快地完成了此索引编制。

Cha*_*roe 3

我实际上最终使用了

system("killall pbs;/System/Library/CoreServices/pbs -flush");
Run Code Online (Sandbox Code Playgroud)

在我的一个应用程序中,正如您所描述的那样,尽管那是很久以前的事了,当时 10.5 也受到了质疑。

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

void NSUpdateDynamicServices(void)
Run Code Online (Sandbox Code Playgroud)

根据文档,它的作用就像刷新 pbs,但它是一个更干净的解决方案。

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

To build a standalone service, use the extension .service and store it in Library/Services.
Run Code Online (Sandbox Code Playgroud)