Определите, разрешено ли запускать приложение в macOS

Есть ли способ программно определить, разрешено ли запускать приложение в настройках безопасности и конфиденциальности в macOS?

Я пытаюсь автоматически запустить приложение .app, которое загружается из Интернета из приложения Cocoa, но если пользователь не разрешает приложения из-за пределов Mac App Store, мое приложение просто не запустится с диалоговым окном, рекомендующим пользователю изменить их настройки. Я хотел бы знать, запустится ли приложение успешно, а если нет, то открыть настройки безопасности и конфиденциальности самостоятельно, чтобы пользователи могли их изменить.

В основном я ищу функцию AppIsAllowedToLaunch:

if (AppIsAllowedToLaunch(appURL)) {
  // open the app at appURL
} else {
  // open Security & Privacy settings, inform the user that they should change settings
}

Что я пробовал:

  • open(2) всегда возвращает нулевой код выхода, независимо от того, успешно запущено приложение или нет.
  • [NSWorkspace.sharedWorkpace launchApplicationAtURL:options:configuration:error] возвращает экземпляр NSRunningApplication. Этот объект не только не позволяет мне проверить, успешно ли запущено приложение, но также требует от меня попытаться запустить приложение, чтобы увидеть, что происходит, вместо того, чтобы выполнять проверку заранее, что Что мне нужно
  • Альтернативы open(2) с открытым исходным кодом в основном устарели и не отражают изменения в разделе «Безопасность и настройки», которые позволяют пользователям блокировать запуск приложений, не принадлежащих Mac App Store. Оригинальный open(2), к сожалению, не имеет открытого исходного кода.
  • spctl -a /path/to/app.app будет правильно возвращать 3, если запуск приложения запрещен в соответствии с настройками безопасности и конфиденциальности. Но он также возвращает 3, если для запуска приложения требуются привилегии root (и приложение, которое я запускаю), поэтому я не могу использовать этот метод.

Должна быть какая-то системная структура (вероятно, LaunchServices или Security) или системная база данных (похожая на /var/db/SystemPolicyConfiguration/KextPolicy), которую необходимо запросить, чтобы проверить, можно ли успешно запустить приложение.

Мое приложение не изолировано и не распространяется через Mac App Store. Он запускается с правами пользователя.


person Dmitry Serov    schedule 25.12.2018    source источник
comment
spctl -a /path/to/app.app будет правильно возвращать 3, если запуск приложения запрещен в соответствии с настройками безопасности и конфиденциальности. Но он также возвращает 3, если для запуска приложения требуются привилегии root (и приложение, которое я запускаю), поэтому я не могу использовать этот метод - если это правильно, и нет другого способа, почему бы сначала не загрузить небольшое приложение, которое не не требует привилегий root для запуска и использования этого метода, чтобы определить, может ли он работать, и, следовательно, различать два 3 случая?   -  person CRD    schedule 29.12.2018


Ответы (1)


Попробуйте использовать spctl --assess --raw app.app.

--raw обеспечивает вывод XML в дополнение к коду выхода. Мне не удалось найти документацию по этим значениям, но они могут содержать необходимую информацию.

person pointum    schedule 25.12.2018
comment
К сожалению, вывод, который я получаю от команды, недостаточно богат для моих целей. Нет разницы в выводе, независимо от того, разрешены ли только приложения Mac App Store или нет. - person Dmitry Serov; 25.12.2018