如何获取OS X系统版本?

14

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


@JakePetroules 如果这个问题是7年前提出的,并且伪原创是4年前,那么它怎么可能是重复的呢?请看日期。 - Mykhailo Lysenko
因为其他问题包含了被接受的正确答案。而这个问题除了一个在底部的回答之外,所有的答案都是错误或过时的。Stack Overflow 是供人们寻找答案的维基百科,而不是问题和答案的历史记录。 - Jake Petroules
8个回答

20

您可以在"/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并且是不必要的。Gestalt是一个更好(而且更快)的替代方案。 - Quinn Taylor
2
但自10.8起已被弃用,而且似乎这是目前可用的最佳方法。请参见此问题:https://dev59.com/E2gu5IYBdhLWcg3wy598 - hobotron
谢谢,这是我自10.8以来找到的最佳解决方案。 - Michael Robinson
2
@QuinnTaylor Gestalt只读取SystemVersion.plist文件,因此它确实会产生磁盘I/O。尝试更改该文件的内容,您会注意到它会打印出不同的结果。 - Jake Petroules
查看/System/Library/CoreServices/SystemVersion.plist非常有用,例如,如果您已经克隆到外部驱动器,但不知道其版本。 - user535673

11
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];
}

2
很遗憾,自10.8版本起,Gestalt已被弃用。 - Peter Hosey

11

你可以使用 Gestalt:

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

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

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


14
请注意,自10.4版本以来,gestaltSystemVersion已被弃用,建议使用gestaltSystemVersionMajor、gestaltSystemVersionMinor和gestaltSystemVersionBugFix,因为它们可以支持多位数字。例如,使用您的代码无法检测到10.4.10和.11。 - smorgan
5
由于 Gestalt 在 10.8 中已被弃用,是否有另一种替代方法可在 10.6 - 10.8 上使用? - adib
4
这个答案现在完全错误,因为 gestaltSystemVersion 无法表示 10.10 版本。 - Jens Ayton

10

-[NSProcessInfo operatingSystemVersionString]方法返回人类可读且本地化的操作系统版本信息。适用于向用户显示或在错误电子邮件等中使用,但不适合进行解析。


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

7

再次强调,您可以使用Gestalt。请查看文档以获取更多信息;具体来说,您需要在Gestalt Manager参考文档的“系统版本常量”部分中传递gestaltSystemVersionMajorgestaltSystemVersionMinorgestaltSystemVersionBugFix常量。


1
在10_10之后,8_0被提出了更好、更简单的方法,即
[NSProcessInfo processInfo].operatingSystemVersion
这将返回一个包含所有3个数字的NSOperatingSystemVersion结构体。

0

使用这个方法,它将返回Mac OS X的版本

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

0

嗯,对于一个简单的检查来说,这似乎比它值得的麻烦。也许如果我已经在使用GTM,但只是检查“gestaltSystemVersionMinor”更简单。 - Quinn Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接