问题
I am using below code to check OS X version at runtime.
if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_10)
{
/* On a 10.10.x or earlier system */
}
But this condition return false on 10.10.4 OS X. I am using Xcode 6.3.2.
According to AppKit Release Notes for OS X v10.11, It should work.
if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_9) {
/* On a 10.9.x or earlier system */
} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_10) {
/* On a 10.10 - 10.10.x system */
} else {
/* 10.11 or later system */
}
回答1:
Since Xcode 9.0, you can use code below. Reference to Apple documentation.
Swift
if #available(macOS 10.13, *) {
// macOS 10.13 or later code path
} else {
// code for earlier than 10.13
}
Objective-C
if (@available(macOS 10.13, *)) {
// macOS 10.13 or later code path
} else {
// code for earlier than 10.13
}
回答2:
So the #define for 10_10
you see there is for 10.10.0
.
If you look for older version numbers, you'll see specific #define
's for MacOS 10.7.4, MacOS 10.5.3.
And what is happening here is that on a 10.10.4 machine (like yours and mine), the app kit number for 10.10.4 is greater than the one defined for 10.10.0.
That is, in swift, I did:
func applicationDidFinishLaunching(aNotification: NSNotification) {
print("appkit version number is \(NSAppKitVersionNumber)")
}
And I got:
appkit version number is 1348.17
So your code is actually checking for 10.10.0 and older.
If you want to check for all versions of Yosemite & newer, you'll probably want to do something like
#ifdef NSAppKitVersionNumber10_11
if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_11)
{
/* On a 10.10.x or earlier system */
}
#endif
which will compile once you start building with Xcode 7 (and once Apple gets around to defining the official shipping version/build number for the El Capitan release)
FWIW, the Xcode 7 beta I have includes "NSAppKitVersionNumber10_10_3
" in the 10.11 SDK.
回答3:
If you need to support multiple systems (you can adapt method return value):
#import <objc/message.h>
+ (NSString *)systemVersion
{
static NSString *systemVersion = nil;
if (!systemVersion) {
typedef struct {
NSInteger majorVersion;
NSInteger minorVersion;
NSInteger patchVersion;
} MyOperatingSystemVersion;
if ([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]) {
MyOperatingSystemVersion version = ((MyOperatingSystemVersion(*)(id, SEL))objc_msgSend_stret)([NSProcessInfo processInfo], @selector(operatingSystemVersion));
systemVersion = [NSString stringWithFormat:@"Mac OS X %ld.%ld.%ld", (long)version.majorVersion, version.minorVersion, version.patchVersion];
}
else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SInt32 versMaj, versMin, versBugFix;
Gestalt(gestaltSystemVersionMajor, &versMaj);
Gestalt(gestaltSystemVersionMinor, &versMin);
Gestalt(gestaltSystemVersionBugFix, &versBugFix);
systemVersion = [NSString stringWithFormat:@"Mac OS X %d.%d.%d", versMaj, versMin, versBugFix];
#pragma clang diagnostic pop
}
}
return systemVersion;
}
回答4:
Starting with Yosemite, you can use [NSProcessInfo processInfo].operatingSystemVersion
and test the result in the struct NSOperatingSystemVersion
.
回答5:
Update:
Use #define NSAppKitVersionNumber10_10_Max 1349
Old:
From 10.11 SDK
#define NSAppKitVersionNumber10_7_2 1138.23
#define NSAppKitVersionNumber10_7_3 1138.32
#define NSAppKitVersionNumber10_7_4 1138.47
#define NSAppKitVersionNumber10_8 1187
#define NSAppKitVersionNumber10_9 1265
#define NSAppKitVersionNumber10_10 1343
#define NSAppKitVersionNumber10_10_2 1344
#define NSAppKitVersionNumber10_10_3 1347
for 10.10.4 Its 1348.0
(From NSLog output)
They increase decimal part for 10.10.x constant.
The workaround is to use CFBundleVersion
value /System/Library/Frameworks/AppKit.framework/Resources/Info.plist
on 10.11.
if (NSAppKitVersionNumber < 1391.12)
{
/* On a 10.10.x or earlier system */
}
NOTE: My OS X 10.11 build version is 15A244a. If someone have first build , Please update the value in if condition.
来源:https://stackoverflow.com/questions/31958010/how-to-check-mac-os-x-version-at-runtime