2

我们有一个桌面 JavaFX 应用程序(嗯,TornadoFX),它下载一个存档,从中提取另一个应用程序并使用 macOSopen命令启动这个应用程序。简化的 kotlin 代码如下所示:

ProcessBuilder(listOf("open", "/path/to/app.app", "arg")).start()

这已经在旧版本的 macOS(10.15 和更早版本)上运行了多年,但现在随着 macOS 11 Big Sur 启动应用程序有时会成功,有时会失败。

在 mac Console.app 中可以看到以下错误:

OSStatus _LSCopyApplicationNodeFromOpenState(LSOpenState *):返回 kLSNoExecutableErr 因为节点是一个目录,但我们未能注册并出现错误 -10814

我们扩展了逻辑以在启动应用程序之前检查所有文件是否确实存在,并且文件存在。

假设 Launch Services 数据库更新速度不够快。

以下尝试记录可能发生的事情的方法没有发现任何错误:

lsappinfo 永远听 +all

日志流 --debug --predicate 'subsystem == "com.apple.coreservices.launchservices"'

是否有人知道是否有办法避免这种行为并始终能够启动应用程序?

4

1 回答 1

2

经过大量研究和调试,似乎对我们有用的是,强制启动服务通过执行以下命令在其数据库中注册应用程序:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /path/to/app.app

然后我们可以启动应用程序。

在这个答案中找到了这种解决方案的想法。

于 2021-03-09T16:20:53.990 回答