如何在运行时检查 Mac OS X 版本
How to check Mac OS X version at runtime
我正在使用下面的代码在运行时检查 OS X 版本。
if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_10)
{
/* On a 10.10.x or earlier system */
}
但是这个条件 return 在 10.10.4 OS X 上是错误的。我正在使用 Xcode 6.3.2.
根据 AppKit Release Notes for OS X v10.11,它应该有效。
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 */
}
所以您看到的 10_10
的 #define 是 10.10.0
。
如果您查找旧版本号,您会看到特定的 #define
用于 MacOS 10.7.4、MacOS 10.5.3。
这里发生的事情是,在 10.10.4 机器上(比如你和我的机器),10.10.4 的应用程序包编号 更大 比为 10.10.0 定义的那个。
也就是说,在swift,我做了:
func applicationDidFinishLaunching(aNotification: NSNotification) {
print("appkit version number is \(NSAppKitVersionNumber)")
}
我得到了:
appkit version number is 1348.17
所以您的代码实际上是在检查 10.10.0 及更早版本。
如果您想检查 Yosemite 及更新版本的所有版本,您可能需要执行类似
的操作
#ifdef NSAppKitVersionNumber10_11
if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_11)
{
/* On a 10.10.x or earlier system */
}
#endif
一旦您开始使用 Xcode 7 构建(并且一旦 Apple 着手定义 El Capitan 版本的官方发货 version/build 编号),它将编译
FWIW,我的 Xcode 7 beta 在 10.11 SDK 中包含“NSAppKitVersionNumber10_10_3
”。
更新:
使用#define NSAppKitVersionNumber10_10_Max 1349
旧:
从 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
对于 10.10.4 它的 1348.0
(来自 NSLog 输出)
他们将小数部分增加为 10。10.x 常数。
解决方法是在 10.11 上使用 CFBundleVersion
值 /System/Library/Frameworks/AppKit.framework/Resources/Info.plist
。
if (NSAppKitVersionNumber < 1391.12)
{
/* On a 10.10.x or earlier system */
}
注意: 我的 OS X 10.11 构建版本是 15A244a。如果有人第一次构建,请更新if条件中的值。
从 Yosemite 开始,您可以使用 [NSProcessInfo processInfo].operatingSystemVersion
并在结构 NSOperatingSystemVersion
.
中测试结果
如果需要支持多系统(可以适配方法return取值):
#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;
}
从 Xcode 9.0 开始,您可以使用下面的代码。
参考 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
}
我正在使用下面的代码在运行时检查 OS X 版本。
if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_10)
{
/* On a 10.10.x or earlier system */
}
但是这个条件 return 在 10.10.4 OS X 上是错误的。我正在使用 Xcode 6.3.2.
根据 AppKit Release Notes for OS X v10.11,它应该有效。
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 */
}
所以您看到的 10_10
的 #define 是 10.10.0
。
如果您查找旧版本号,您会看到特定的 #define
用于 MacOS 10.7.4、MacOS 10.5.3。
这里发生的事情是,在 10.10.4 机器上(比如你和我的机器),10.10.4 的应用程序包编号 更大 比为 10.10.0 定义的那个。
也就是说,在swift,我做了:
func applicationDidFinishLaunching(aNotification: NSNotification) {
print("appkit version number is \(NSAppKitVersionNumber)")
}
我得到了:
appkit version number is 1348.17
所以您的代码实际上是在检查 10.10.0 及更早版本。
如果您想检查 Yosemite 及更新版本的所有版本,您可能需要执行类似
的操作#ifdef NSAppKitVersionNumber10_11
if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_11)
{
/* On a 10.10.x or earlier system */
}
#endif
一旦您开始使用 Xcode 7 构建(并且一旦 Apple 着手定义 El Capitan 版本的官方发货 version/build 编号),它将编译
FWIW,我的 Xcode 7 beta 在 10.11 SDK 中包含“NSAppKitVersionNumber10_10_3
”。
更新:
使用#define NSAppKitVersionNumber10_10_Max 1349
旧:
从 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
对于 10.10.4 它的 1348.0
(来自 NSLog 输出)
他们将小数部分增加为 10。10.x 常数。
解决方法是在 10.11 上使用 CFBundleVersion
值 /System/Library/Frameworks/AppKit.framework/Resources/Info.plist
。
if (NSAppKitVersionNumber < 1391.12)
{
/* On a 10.10.x or earlier system */
}
注意: 我的 OS X 10.11 构建版本是 15A244a。如果有人第一次构建,请更新if条件中的值。
从 Yosemite 开始,您可以使用 [NSProcessInfo processInfo].operatingSystemVersion
并在结构 NSOperatingSystemVersion
.
如果需要支持多系统(可以适配方法return取值):
#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;
}
从 Xcode 9.0 开始,您可以使用下面的代码。 参考 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
}