如何在运行时检查Mac OS X版本

时间:2015-08-12 06:54:06

标签: objective-c macos cocoa nsapplication osx-elcapitan

我使用下面的代码在运行时检查OS X版本。

if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_10)
{
    /* On a 10.10.x or earlier system */
}

但是这个条件在10.10.4 OS X上返回false。我正在使用Xcode 6.3.2。

enter image description here

根据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 */
}

5 个答案:

答案 0 :(得分:6)

从Xcode 9.0开始,您可以使用以下代码。 参考Apple documentation

<强>夫特

if #available(macOS 10.13, *) {
      // macOS 10.13 or later code path
} else {
      // code for earlier than 10.13
}

<强>目标C

if (@available(macOS 10.13, *)) {
      // macOS 10.13 or later code path
} else {
      // code for earlier than 10.13
}

答案 1 :(得分:3)

所以10_10的#define会显示10.10.0

如果您查找较旧的版本号,则会看到MacOS 10.7.4,MacOS 10.5.3的特定#define

这里发生的事情是,在10.10.4机器上(比如你和我的机器),10.10.4的应用程序套件编号 更大 比定义为10.10.0。

也就是说,我很快就做到了:

func applicationDidFinishLaunching(aNotification: NSNotification) {
    print("appkit version number is \(NSAppKitVersionNumber)")
}

我得到了:

appkit version number is 1348.17

因此,您的代码实际上是在检查10.10.0及更早版本。

如果您想检查所有版本的Yosemite&amp;更新,你可能想要做类似

的事情
#ifdef NSAppKitVersionNumber10_11
if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_11)
{
    /* On a 10.10.x or earlier system */
}    
#endif

一旦你开始使用Xcode 7进行构建(一旦Apple开始定义El Capitan版本的官方发货版本/内部版本号),它就会编译完毕。

FWIW,Xcode 7 beta我在10.11 SDK中包含了“NSAppKitVersionNumber10_10_3”。

答案 2 :(得分:3)

如果您需要支持多个系统(您可以调整方法返回值):

#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;
}

答案 3 :(得分:0)

更新

使用#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条件中的值。

答案 4 :(得分:0)

从Yosemite开始,您可以使用[NSProcessInfo processInfo].operatingSystemVersion并在结构NSOperatingSystemVersion中测试结果。