从 JavaFX 应用程序在 macOS 11 Big Sur 上打开应用程序随机失败并出现 kLSNoExecutableErr
Opening app on macOS 11 Big Sur from JavaFX application randomly fails with kLSNoExecutableErr
我们有一个桌面 JavaFX 应用程序(嗯,TornadoFX)下载一个存档,从中提取另一个应用程序并使用 macOS open
命令启动这个应用程序。
简化的 kotlin 代码如下所示:
ProcessBuilder(listOf("open", "/path/to/app.app", "arg")).start()
这在 macOS(10.15 及更早版本)的旧版本上已经工作多年,但现在 macOS 11 Big Sur 有时会成功启动该应用程序有时会失败。
在macConsole.app中可以看到如下错误:
OSStatus _LSCopyApplicationNodeFromOpenState(LSOpenState *): Returning kLSNoExecutableErr because node is a directory but we failed to register with error -10814
我们扩展了逻辑以在启动应用程序之前检查所有文件是否真的存在,并且文件存在。
假设 Launch Services 数据库更新速度不够快。
尝试记录可能发生的事情的以下方法没有发现任何错误:
lsappinfo listen +all forever
log stream --debug --predicate 'subsystem == "com.apple.coreservices.launchservices"'
是否有人知道是否有办法避免这种行为并始终能够启动应用程序?
经过大量研究和调试,似乎对我们有用的方法是强制启动服务通过执行以下命令在其数据库中注册应用程序:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /path/to/app.app
然后我们可以启动该应用程序。
这种解决方案的想法是在 this 答案中找到的。
我们有一个桌面 JavaFX 应用程序(嗯,TornadoFX)下载一个存档,从中提取另一个应用程序并使用 macOS open
命令启动这个应用程序。
简化的 kotlin 代码如下所示:
ProcessBuilder(listOf("open", "/path/to/app.app", "arg")).start()
这在 macOS(10.15 及更早版本)的旧版本上已经工作多年,但现在 macOS 11 Big Sur 有时会成功启动该应用程序有时会失败。
在macConsole.app中可以看到如下错误:
OSStatus _LSCopyApplicationNodeFromOpenState(LSOpenState *): Returning kLSNoExecutableErr because node is a directory but we failed to register with error -10814
我们扩展了逻辑以在启动应用程序之前检查所有文件是否真的存在,并且文件存在。
假设 Launch Services 数据库更新速度不够快。
尝试记录可能发生的事情的以下方法没有发现任何错误:
lsappinfo listen +all forever
log stream --debug --predicate 'subsystem == "com.apple.coreservices.launchservices"'
是否有人知道是否有办法避免这种行为并始终能够启动应用程序?
经过大量研究和调试,似乎对我们有用的方法是强制启动服务通过执行以下命令在其数据库中注册应用程序:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /path/to/app.app
然后我们可以启动该应用程序。
这种解决方案的想法是在 this 答案中找到的。