Cocoa
For a human-readable string, use [[NSProcessInfo processInfo] operatingSystemVersionString]
. It looks like “Version 10.5 (Build 9A581)”, but that format might change in the future. NSProcessInfo.h explicitly warns against using it for parsing. It will always be human-readable though.
For machine-friendly numbers, use the Gestalt function, with one of the selectors:
gestaltSystemVersionMajor
(in 10.4.17 this would be the decimal value 10)
gestaltSystemVersionMinor
(in 10.4.17 this would be the decimal value 4)
gestaltSystemVersionBugFix
(in 10.4.17 this would be the decimal value 17)
Do not use gestaltSystemVersion
unless your code needs to run on OS X 10.2 or earlier. It’s a legacy function that can’t report minor/bugfix versions > 9; meaning it can’t distinguish between 10.4.9 and 10.4.11. The CocoaDev wiki has example code that works in 10.0 if you need to go that route.
Here’s a simpler example of using Gestalt:
- (BOOL) usingLeopard {
long minorVersion, majorVersion;
Gestalt(gestaltSystemVersionMajor, &majorVersion);
Gestalt(gestaltSystemVersionMinor, &minorVersion);
return majorVersion == 10 && minorVersion == 5;
}
Scripts
For scripts and command-line work, there is the sw_vers command.
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.5
BuildVersion: 9A581
$ sw_vers -productName
Mac OS X
$ sw_vers -productVersion
10.5
$ sw_vers -buildVersion
9A581
Java
Check the value of:
System.getProperty("os.name");
System.getProperty("os.version");
Fallback
Finally, if you must, you can parse /System/Library/CoreServices/SystemVersion.plist
— but I don’t like the idea of doing that. There’s a chance that the file could have been corrupted or maliciously altered. It seems safer, and less complicated, to directly ask the operating system it’s version.
Minimum OS Requirements
To enforce a minimum OS requirement for your application, you can set the LSMinimumSystemVersion key in the Info.plist file. Big Nerd Ranch has a more robust, user-friendly, but complicated solution for older legacy systems.