1

NSAppKitVersionNumber使用来检查 Cocoa 框架在运行时提供的新特性是一个常见的建议:

https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/

一个典型的用法是 floor() 值,并检查 NSApplication.h 中提供的值。例如:

if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_8) {
  /* On a 10.8.x or earlier system */
} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_9) {
  /* On a 10.9 - 10.9.x system */
} else {
  /* 10.10 or later system */
}

在 OS X 10.10 和 Xcode 6.2 中,NSApplication.h包括:

/* The version of the AppKit framework */
APPKIT_EXTERN const double NSAppKitVersionNumber;

#define NSAppKitVersionNumber10_0 577
#define NSAppKitVersionNumber10_1 620
#define NSAppKitVersionNumber10_2 663
#define NSAppKitVersionNumber10_2_3 663.6
#define NSAppKitVersionNumber10_3 743
#define NSAppKitVersionNumber10_3_2 743.14
#define NSAppKitVersionNumber10_3_3 743.2
#define NSAppKitVersionNumber10_3_5 743.24
#define NSAppKitVersionNumber10_3_7 743.33
#define NSAppKitVersionNumber10_3_9 743.36
#define NSAppKitVersionNumber10_4 824
#define NSAppKitVersionNumber10_4_1 824.1
#define NSAppKitVersionNumber10_4_3 824.23
#define NSAppKitVersionNumber10_4_4 824.33
#define NSAppKitVersionNumber10_4_7 824.41
#define NSAppKitVersionNumber10_5 949
#define NSAppKitVersionNumber10_5_2 949.27
#define NSAppKitVersionNumber10_5_3 949.33
#define NSAppKitVersionNumber10_6 1038
#define NSAppKitVersionNumber10_7 1138
#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

值得注意的是NSAppKitVersionNumber10_10OS X 10.10 Yosemite 的缺失。

10_10版本是否被明确排除在外,出于什么原因?

这些常量通常仅在它们成为当前版本后才出现在版本中吗?

还是这种检查版本号的方法现在已经过时了?如果是这样,替代品是什么?

4

2 回答 2

2

这些常量通常仅在它们成为当前版本后才出现在版本中吗?

是的。同样,10.9 SDK 只定义了 up 到NSAppKitVersionNumber10_8.

您会注意到您引用的代码片段不包括对 10.10 的显式检查。这只是所有其他检查之后的隐式回退。

于 2015-04-01T00:06:46.510 回答
2

正如肯指出的那样,这NSAppKitVersionNumber并不明确。要注意的另一个方面是可用性,例如注意:

NSAppKitVersionNumber10_8

The AppKit framework included in OS X v10.8.
Available in OS X v10.9 and later.

未来版本中的假设示例NSApplication.h

#define NSAppKitVersionNumber10_10 1343.14

这可能等同于:

NSAppKitVersionNumber10_10

The AppKit framework included in OS X v10.10.
Available in OS X v11.0 and later.

还有一些其他有用的常量可能对版本检查有用:

在标头中标记更新的 API:

标头中的新 API 标有包含对“10_10”的引用的修饰:

NS_AVAILABLE_MAC(10_10)
NS_AVAILABLE(10_10, <iOS Release>)
NS_CLASS_AVAILABLE(10_10, <iOS Release>)
NS_ENUM_AVAILABLE(10_10)

结构体:

#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_10
 ...
#endif

已弃用的 API 标有:

NS_DEPRECATED_MAC(<Release when introduced>, 10_10)
NS_DEPRECATED_MAC(<Release when introduced>, 10_10, "Suggested alternative”)

在 10.10 中,已将 deprecated 属性添加到许多以前软弃用的方法中。请注意弃用警告并修改您的代码以使用受支持的替代方案。在 AppKit 头中搜索 NS_DEPRECATED_MAC 并过滤 10_10 将产生受影响符号的列表。

AppKit 框架参考

于 2015-04-01T00:34:52.657 回答