Открытие приложения на macOS 11 Big Sur из приложения JavaFX случайным образом не выполняется с помощью kLSNoExecutableErr

У нас есть настольное приложение JavaFX (ну, TornadoFX), которое загружает архив, извлекает из него другое приложение и запускает это приложение с помощью команды macOS open. Упрощенный код котлина выглядит так:

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 слушать + все навсегда

поток журнала --debug --predicate 'subsystem == com.apple.coreservices.launchservices'

Кто-нибудь знает, есть ли способ избежать такого поведения и всегда иметь возможность запускать приложение?


person AbstractVoid    schedule 05.03.2021    source источник


Ответы (1)


После долгих исследований и отладки то, что, похоже, сработало для нас, заключалось в том, чтобы заставить Launch Services зарегистрировать приложение в своей базе данных, выполнив такую ​​команду, как:

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

а потом мы могли запустить приложение.

Идея такого решения была найдена в этом ответе.

person AbstractVoid    schedule 09.03.2021