7

以下のコードを使用して、実行時に 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 を使用しています。

ここに画像の説明を入力

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 */
}
4

5 に答える 5

3

したがって、#define for10_10は for10.10.0です。

古いバージョン番号を探すと#define、MacOS 10.7.4、MacOS 10.5.3 の特定の番号が表示されます。

ここで何が起こっているかというと、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以降のすべてのバージョンを確認したい場合は、おそらく次のようにしたいと思うでしょう。

#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 ベータ版にはNSAppKitVersionNumber10_10_3、10.11 SDK に「 」が含まれています。

于 2015-08-12T07:08:54.660 に答える
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;
}
于 2015-09-16T22:38:13.947 に答える
1

Yosemite から[NSProcessInfo processInfo].operatingSystemVersion、 struct で結果を使用およびテストできますNSOperatingSystemVersion

于 2015-08-15T11:59:57.603 に答える
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

for 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 条件の値を更新してください。

于 2015-08-12T07:29:56.420 に答える