我正在开发一个应用程序,由于我无法控制的限制,正在使用过时的macOS SDK(在这种情况下是macOS 10.15 SDK)构建x86_64应用程序。
它在使用Rosetta 2的Apple Silicon mac上运行良好,但应用程序需要获得当前版本的macOS,并且在这些条件下可用的api对它撒谎,始终报告版本是10.16,而实际上它应该是macOS 11。X或12.x.
在系统API所在的其他情况下,我已经能够使用sysctl获得真实信息,但在这种情况下,调用sysctlbyname("kern.osproductversion", ...)
仍然对我的应用程序和报告10.16。
在这种情况下我怎样才能得到真正的macOS版本?
到目前为止,我找到的唯一解决方案是将sysctl
命令行实用程序作为一个单独的进程启动,并使用它来查询系统版本。下面是一个使用Qt的c++实现:
QProcess *p = new QProcess;
p->setProgram("/usr/sbin/sysctl");
p->setArguments({"-b", "kern.osproductversion"});
p->start();
if (!p->waitForFinished(2000)) {
// handle unlikely error here
}
QByteArray systemVersion = p->readAllStandardOutput();
好的一面是,这只需要执行一次,因为系统版本在进程的生命周期中可能不会改变。尽管如此,我还是把这个问题留下,以防有人有更好的解决方案。