有没有办法以编程方式确定是否允许在 macOS 的安全和隐私设置中启动应用程序?
我正在尝试以静默方式启动从 Cocoa 应用程序中从 Web 下载的 .app,但如果用户不允许来自 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。但是,如果应用程序需要 root 权限才能运行(并且我正在启动的应用程序需要),它也会返回 3,所以我不能使用这种方法。
为了检查应用程序是否可以成功启动,必须查询一些系统框架(可能是LaunchServices
或Security
)或系统数据库(类似于)。/var/db/SystemPolicyConfiguration/KextPolicy
我的应用程序没有经过沙盒处理,也没有通过 Mac App Store 分发。它以用户权限运行。