我已经实施了基于' simpleEncrypt'的MacOS服务。 Apple文档中的示例。我正在运行10.9和Xcode 6.2。
我可以构建应用程序包,将其复制到/ Applications,运行一次,我的服务将出现在其他应用程序中。按预期的服务菜单。
如果我运行' pbs -dump_pboard',我的应用程序包的正确路径将按预期显示为NSBundlePath。
但是,当我从“服务”菜单中选择我的服务时,MacOS将启动位于〜/ Library / Developer / Xcode / Archives中的应用程序的旧副本。
如果我删除那个旧副本,它将从其他地方运行另一个副本。只有在我删除文件系统上与我的服务的NSPortName具有相同CFBundleName的所有其他应用程序包之后,MacOS才会从/ Applications启动正确的应用程序包。如果确实如此,该服务正常运作。
如何让MacOS可靠地为我的服务调用正确的应用程序包?
答案 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
布尔参数在代码中使用函数LSRegisterURL
和inUpdate
注册应用程序,或者:
更新应用程序的修改时间,以确保它将由自动注册实用程序更新
我希望您仍然必须直接运行应用程序,以确保Launch Services更新其数据库。对于bundle,您可以直接导航到应用程序的二进制文件。以Caculator.app为例,您可以执行: -
/Applications/Calculator.app/Contents/MacOS/Calculator
我发现的另一个选项是通过递增版本号来更新应用程序的Info.plist,或者更彻底地更改其CFBundleIdentifier。