gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:49:04 25 4
gpt4 key购买 nike

我已经基于 Apple 文档中的“simpleEncrypt”示例实现了 MacOS 服务。我运行的是 10.9 和 Xcode 6.2。

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

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

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

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

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

最佳答案

在 OS X 中,应用程序注册为 Launch Services ,它负责在请求时执行应用程序,可以通过双击其应用程序包、通过聚光灯,或者根据您的情况,从“服务”菜单运行。

注册是自动进行的,例如,当将应用程序复制到/Applications 文件夹(这不仅仅是复制文件)或者甚至只是运行该进程时,就会发生注册。

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

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

由于您拥有同一应用程序的多个副本,因此它们的注册详细信息是相同的,因此 Launch Services 不会更新其数据库,而只是执行第一个与注册详细信息匹配的应用程序。

Apple docs ,它建议您可以使用 inUpdate bool 参数,使用函数 LSRegisterFSRefLSRegisterURL 在代码中注册应用程序,或者:

update the modification time of the application to ensure that it will be updated by the automatic registration utilities

我希望您仍然需要直接运行应用程序,以确保启动服务更新其数据库。对于 bundle ,您可以直接导航到应用程序的二进制文件。使用 Caculator.app 作为示例,您将执行:-

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

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

关于objective-c - 服务菜单启动错误的应用程序包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33204293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com