Xcode预处理器macros来检查基本SDK> = iOS 7.0

是否有任何预处理macros仅在基本SDK为7.0或更高版本时编译某些代码部分? 定义的“__IPHONE_7_0”常量似乎与iOS开发目标(而不是基本SDK)相关联。

我正在使用安装了iOS 7和iOS 6.1的XCode 5。

我问这个问题的原因是我目前正在将一个应用程序从iOS 6转换到iOS 7.需要调整的东西有很多,而且我现在仍然想用iOS 6.1编译我的应用程序作为基础SDK(以及与开发目标iOS 6.0),但已经想要添加一些代码,每当我用iOS 7 SDK编译,但如果基本SDK是iOS 6.1编译不会。

例:

if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) { [_tableView setSeparatorInset:UIEdgeInsetsZero]; } 

上面这段代码不能用iOS 6.1基本SDK进行编译,因为它抱怨没有为UITableView定义setSeparatorInset。 因此,我想将这段代码包含在预处理指令中,有条件地在基础SDK上。

您应该阅读Apple的SDK兼容性指南 ,其中介绍了所有这些技术。

尤其是,他们build议使用__IPHONE_OS_VERSION_MIN_REQUIREDmacros来testing项目的部署目标 (最低支持版本),并且针对您的情况使用__IPHONE_OS_VERSION_MAX_ALLOWEDmacros来testing用于编译的基本SDK


例:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // Only COMPILE this if compiled against BaseSDK iOS7.0 or greater if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) { // Even when compiled with BaseSDK 7, only EXECUTE that if the user uses an // OS that support this method (namely if the user is running iOS7 or later, // but not for users running iOS6). [_tableView setSeparatorInset:UIEdgeInsetsZero]; } #endif 

重要提示:您应该在比较中使用数字常量,就像testing#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0 ,例如在使用SDK 6时不起作用,因为__IPHONE_7_0在该上下文中未被定义为0,因此您的条件不会按预期工作。

是的,你可以使用__IPHONE_7_0定义:

 #ifdef __IPHONE_7_0 if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) { [_tableView setSeparatorInset:UIEdgeInsetsZero]; } #endif 

根据Apple Doc,您应该使用NSFoundationVersionNumber来区分iOS 7和其他版本。 你可以使用下面的macros来简化它:

 #define isIOS6 floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1 #define isIOS7 floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1 

然后在代码中做

 #ifdef __IPHONE_7_0 if (isIOS7) { // Do additional stuff for iOS 7. } #endif 

是的,您应该检查编译时(使用#ifdef )和运行时(使用isIOS7 ),这样您就可以使用iOS6 SDK,iOS7 SDK和iOS7 SDK来编译iOS6目标。

哦! 请记住, if (!isIOS7)你不能使用if (isIOS6)

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/

另外,你可以使用这个macros

 #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:(v) options:NSNumericSearch] != NSOrderedAscending) 

例如if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.1")) {[self doSomething];} else {[self doSomethingElse];}

你不应该testing的SDK,但方法/类恕我直言的可用性。 所以根本不用预编译