Есть ли способ программно определить, разрешено ли запускать приложение в настройках безопасности и конфиденциальности в 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. Он запускается с правами пользователя.
spctl -a /path/to/app.app
будет правильно возвращать 3, если запуск приложения запрещен в соответствии с настройками безопасности и конфиденциальности. Но он также возвращает 3, если для запуска приложения требуются привилегии root (и приложение, которое я запускаю), поэтому я не могу использовать этот метод - если это правильно, и нет другого способа, почему бы сначала не загрузить небольшое приложение, которое не не требует привилегий root для запуска и использования этого метода, чтобы определить, может ли он работать, и, следовательно, различать два 3 случая? - person CRD   schedule 29.12.2018