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

标签 objective-c macos cocoa

我创建了一个应用程序,它通过在我的应用程序 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 可能在其最新版本中更快地进行了索引编制。

最佳答案

我实际上已经结束了使用

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.

关于objective-c - 使用新服务项目更新 OSX 右键单击​​上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11941516/

相关文章:

ios - BezierPath 和掩蔽

c++ - OpenGL 洪水填充无法识别边界

macos - 构建后的二进制文件在哪里(对于 ffmpeg)?

html - 如何在 Safari 的地址字段中禁用自动完成功能?

objective-c - IBAction 中属性(property)失去值(value)

iOS 8 : Region Monitoring, 如何让它工作

ios - 等待从 Web API iOS 加载数据结束

iphone - 我怎样才能在 obj c 中实现这种智能搜索

ios - dyld : Library not loaded: @rpath/libswiftCoreLocation. dyli

cocoa - NSUserDefaults objectForKey 输出比较不起作用