繁体   English   中英

Xcode预处理器宏来检查Base SDK> = iOS 7.0

[英]Xcode preprocessor macro to check if Base SDK >= iOS 7.0

是否只有在Base 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 base SDK编译,因为它抱怨没有为UITableView定义setSeparatorInset。 因此,我想在预处理器指令中包含这段代码,有条件地在基本SDK上。

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

特别是,他们建议使用__IPHONE_OS_VERSION_MIN_REQUIRED宏来测试项目的部署目标 (最低支持版本),对于您的情况, 使用__IPHONE_OS_VERSION_MAX_ALLOWED宏来测试用于编译的Base 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

重要说明:您应该在比较中使用数字常量,就像测试#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和其他。 您可以使用以下宏来简化:

#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/

此外,您可以使用此宏

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

您不应该测试sdk,而是测试方法/类IMHO的可用性。 所以根本没有预编译

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM