【问题标题】:How to get the OS X system version?如何获取 OS X 系统版本?
【发布时间】:2016-08-17 01:43:54
【问题描述】:

我想获取OS X系统版本,如:10.5.4、10.4.8等。我想在我的应用程序中获取它,我该怎么做?谢谢!

【问题讨论】:

  • @JakePetroules 如果在 7 年前被问及伪原创 - 4 年前,它怎么可能是重复的!请看日期。
  • 因为另一个问题包含正确答案作为已接受的答案。这一个包含所有错误或过时的答案,除了一个位于底部的答案。 Stack Overflow 是一个供人们寻找答案的 wiki,而不是问题和答案的历史记录。

标签: cocoa macos


【解决方案1】:

您可以阅读“/System/Library/CoreServices/SystemVersion.plist”中的属性列表并提取“ProductVersion”键,这就是 OS X 安装程序应用程序的操作方式。下面是一个示例:

NSString *versionString;
NSDictionary * sv = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"];
versionString = [sv objectForKey:@"ProductVersion"];

或者,命令swvers -productVersion 也会这样做。

【讨论】:

  • 这行得通,但它会产生磁盘 I/O 并且是不必要的。格式塔是一种更好(更快)的替代方案。
  • 但自 10.8 起已弃用,似乎这是目前可用的最佳方式。看到这个问题:stackoverflow.com/questions/11072804/…
  • 谢谢,自 10.8 以来我找到的最佳解决方案
  • @QuinnTaylor Gestalt 只是读取 SystemVersion.plist,因此它确实会产生磁盘 I/O。尝试更改该文件的内容,您会发现它打印出不同的结果。
  • 查看 /System/Library/CoreServices/SystemVersion.plist 很有用,例如,如果您已克隆到外部驱动器但您不知道哪个版本。
【解决方案2】:

你可以使用格式塔:

SInt32 version = 0;
Gestalt( gestaltSystemVersion, &version );
BOOL leopard = ( version >= 0x1050 );

if ( leopard )
{
    //draw it this way
}
else
{
    //draw it that way
}

请记住,如果您要检查方法是否可用,最好直接使用 respondsToSelector: 进行测试。

【讨论】:

  • 请注意,从 10.4 开始不鼓励使用 gestaltSystemVersion,而是支持 gestaltSystemVersionMajor、gestaltSystemVersionMinor 和 gestaltSystemVersionBugFix,因为有 1 位数的限制。例如,10.4.10 和 .11 无法使用您的代码检测到。
  • 由于格式塔在 10.8 中已被弃用,是否有替代方法适用于 10.6 - 10.8?
  • 这个答案现在是错误的,因为 gestaltSystemVersion 不能代表 10.10。
【解决方案3】:
NSString *osver()
{
    SInt32 versionMajor=0, versionMinor=0, versionBugFix=0;
    Gestalt(gestaltSystemVersionMajor, &versionMajor);
    Gestalt(gestaltSystemVersionMinor, &versionMinor);
    Gestalt(gestaltSystemVersionBugFix, &versionBugFix);
    return [NSString stringWithFormat:@"%d.%d.%d", versionMajor, versionMinor, versionBugFix];
}

【讨论】:

  • 可悲的是,格式塔自 10.8 起已弃用。
【解决方案4】:

-[NSProcessInfo operatingSystemVersionString] 是人​​类可读和本地化的。适合显示给用户或在错误邮件等中使用,但不适合解析。

【讨论】:

  • +1:非常好。我建议稍微修改一下提到类方法+processInfo 以获取实例以调用-operatingSystemVersionString
  • 是否可以从C++代码中调用[NSProcessInfo operatingSystemVersionString]?
  • 没有。您需要围绕它创建一个包装器方法才能从 C++ 调用它,并且您必须在程序中添加一些 Objective-C 才能做到这一点。您可以将该文件设为 Objective-C++,您可以使用 Gestalt,您可以使用 system() 从命令行调用 swvers -productVersion,或者您可以从文件系统中读取它(如本页其他地方所述)。这取决于你的情况和你想要做什么。
【解决方案5】:

同样,您可以使用格式塔。查看文档以获取更多信息;具体来说,您需要在Gestalt Manager Reference documentation 的“系统版本常量”部分传递gestaltSystemVersionMajorgestaltSystemVersionMinorgestaltSystemVersionBugFix 常量

【讨论】:

    【解决方案6】:

    在 10_10 之后,8_0 出现了更好和最简单的方法是
    [NSProcessInfo processInfo].operatingSystemVersion
    这将返回
    NSOperatingSystemVersion struct
    包含所有 3 个数字。

    【讨论】:

      【解决方案7】:

      其他人在 Mac 版 Google 工具箱中提到的 Gestalt 调用周围还有一个 Cocoa 包装器: http://code.google.com/p/google-toolbox-for-mac/source/browse/trunk/Foundation/GTMSystemVersion.h

      【讨论】:

      • 嗯,看起来麻烦多于简单检查的价值。也许如果我已经在使用 GTM,但检查 gestaltSystemVersionMinor 会更简单。
      【解决方案8】:

      使用此方法将返回 Mac OS X 版本

      +(SInt32) OSVersion;
      {
          SInt32 osxMinorVersion;
          Gestalt(gestaltSystemVersionMinor, &osxMinorVersion);
          return osxMinorVersion;
      } 
      

      【讨论】:

        猜你喜欢
        • 2013-01-25
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        • 2014-01-16
        • 1970-01-01
        相关资源
        最近更新 更多