c++ - macOS 版本返回为 10.16,而不是 12.0

标签 c++ macos core-foundation macos-monterey

我正在新的 macOS 12 Monterey beta 上运行使用 C++ 构建的应用程序。该应用程序是使用 macOS SDK 10.9 构建的,该版本相当旧。

问题: 有一段代码可以获取平台版本,我在其中解析 System/Library/CoreServices/SystemVersion.plist 的内容使用 Core-Foundation API 的文件。应用程序不会将 macOS 版本返回为 12.0,而是将其读取为 10.16。代码中没有缺陷,因为相同的代码已用于识别许多较旧的 macOS 版本。

可能的原因: macOS 11.0 bigSur 版本期间发生了一些变化,其中有另一个文件名 SystemVersionCompat.plist 与 SystemVersion.plist 位于同一位置。我的应用程序正在读取前者而不是后者的 plist,并且在一些网络搜索中由于使用了较旧的 SDK 而了解了它。

System/Library/CoreServices/SystemVersion.plist的内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ProductBuildVersion</key>
    <string>21A5304g</string>
    <key>ProductCopyright</key>
    <string>1983-2021 Apple Inc.</string>
    <key>ProductName</key>
    <string>macOS</string>
    <key>ProductUserVisibleVersion</key>
    <string>12.0</string>
    <key>ProductVersion</key>
    <string>12.0</string>
    <key>iOSSupportVersion</key>
    <string>15.0</string>
</dict>
</plist>

System/Library/CoreServices/SystemVersionCompat.plist的内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ProductBuildVersion</key>
    <string>21A5304g</string>
    <key>ProductCopyright</key>
    <string>1983-2021 Apple Inc.</string>
    <key>ProductName</key>
    <string>Mac OS X</string>
    <key>ProductUserVisibleVersion</key>
    <string>10.16</string>
    <key>ProductVersion</key>
    <string>10.16</string>
    <key>iOSSupportVersion</key>
    <string>15.0</string>
</dict>
</plist>

有没有其他方便的方法可以在不更新SDK的情况下获取平台版本?

最佳答案

您可以设置环境变量SYSTEM_VERSION_COMPAT = 0 (在读取文件之前在 plist 文件中或在代码本身中) 这将为您提供正确的版本。

在终端上运行以下命令,您将看到差异:

SYSTEM_VERSION_COMPAT=1 cat /System/Library/CoreServices/SystemVersion.plist

SYSTEM_VERSION_COMPAT=0 cat /System/Library/CoreServices/SystemVersion.plist

关于c++ - macOS 版本返回为 10.16,而不是 12.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69097567/

相关文章:

c++ - 多重继承解决抽象类

html - Touch Bar 上的自定义 Safari 书签图标和颜色

swift - NSBitmapImageRep 上的 setColor 在 Swift 中不起作用

有人可以解释一下这段代码的作用吗?

objective-c - ARC 不允许将间接指针转换为指向 'CFReadStreamRef *' 的 Objective-C 指针

objective-c - 为 NSRunLoop 找到匹配的 NSThread(需要修复 Socket Rocket)

ios - 使用 Mobile-Iron : required CoreFoundation property is missing 的内部应用程序分发错误

c++ - 转发到 std::ostream << 时操纵器的模板参数推导失败

c++ - 从 2 个 vector 中提取元素?

c++ - 如果函数指针不需要 & 符号,为什么 boost::bind 需要一个?