服务菜单启动错误的应用程序包

时间:2015-10-18 23:14:02

标签: objective-c xcode macos cocoa service

我已经实施了基于' simpleEncrypt'的MacOS服务。 Apple文档中的示例。我正在运行10.9和Xcode 6.2。

我可以构建应用程序包,将其复制到/ Applications,运行一次,我的服务将出现在其他应用程序中。按预期的服务菜单。

如果我运行' pbs -dump_pboard',我的应用程序包的正确路径将按预期显示为NSBundlePath。

但是,当我从“服务”菜单中选择我的服务时,MacOS将启动位于〜/ Library / Developer / Xcode / Archives中的应用程序的旧副本。

如果我删除那个旧副本,它将从其他地方运行另一个副本。只有在我删除文件系统上与我的服务的NSPortName具有相同CFBundleName的所有其他应用程序包之后,MacOS才会从/ Applications启动正确的应用程序包。如果确实如此,该服务正常运作。

如何让MacOS可靠地为我的服务调用正确的应用程序包?

1 个答案:

答案 0 :(得分:1)

在OS X中,应用程序注册了Launch Services,负责在请求时执行应用程序,方法是双击其应用程序包,通过聚光灯,或者在您的情况下,从“服务”菜单运行

注册是自动进行的,例如,当应用程序被复制到/ Applications文件夹时(不仅仅是复制文件),甚至只是运行该过程。

可以通过使用lsregister参数运行-dump命令来查看已注册应用程序的列表。在OS X 10.10上,它将是: -

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump

由于您拥有同一个应用程序的多个副本,因此其注册详细信息完全相同,因此启动服务不会更新其数据库,只是执行与注册详细信息匹配的首个应用程序。

Apple docs中,它建议您可以使用LSRegisterFSRef布尔参数在代码中使用函数LSRegisterURLinUpdate注册应用程序,或者:

  

更新应用程序的修改时间,以确保它将由自动注册实用程序更新

我希望您仍然必须直接运行应用程序,以确保Launch Services更新其数据库。对于bundle,您可以直接导航到应用程序的二进制文件。以Caculator.app为例,您可以执行: -

/Applications/Calculator.app/Contents/MacOS/Calculator

我发现的另一个选项是通过递增版本号来更新应用程序的Info.plist,或者更彻底地更改其CFBundleIdentifier。