如何定义预处理器macros来检查iOS版本

我用它来检查iOS版本,但它不工作:

#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_5_0 #define kCFCoreFoundationVersionNumber_iPhoneOS_5_0 675.000000 #endif #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0 #define IF_IOS5_OR_GREATER(...) \ if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_5_0) \ { \ __VA_ARGS__ \ } #else #define IF_IOS5_OR_GREATER 0 #endif 

当我做

 #if IF_IOS5_OR_GREATER NSLog(@"iOS5"); #endif 

什么都没发生。 这里有什么不对吗?

你已经定义了一个macros,但是你正在以非macros的方式使用它。 尝试这样的事情,与你的macros定义相同。

 IF_IOS5_OR_GREATER(NSLog(@"iOS5");) 

(而不是你的#if / #endif块。)

更简单:

 #define IS_IOS6_AND_UP ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) 
 #ifdef __IPHONE_5_0 

等等

只要看看这个常数。 所有的目标c常量都以两个下划线开头

定义这个方法:

 +(BOOL)iOS_5 { NSString *osVersion = @"5.0"; NSString *currOsVersion = [[UIDevice currentDevice] systemVersion]; return [currOsVersion compare:osVersion options:NSNumericSearch] == NSOrderedAscending; } 

然后将该macros定义为该方法。

对于运行时检查使用这样的东西:

 - (BOOL)iOSVersionIsAtLeast:(NSString*)version { NSComparisonResult result = [[[UIDevice currentDevice] systemVersion] compare:version options:NSNumericSearch]; return (result == NSOrderedDescending || result == NSOrderedSame); } 

如果你在UIDevice上为它创build一个类别,你可以这样使用它:

 @implementation UIDevice (OSVersion) - (BOOL)iOSVersionIsAtLeast:(NSString*)version { NSComparisonResult result = [[self systemVersion] compare:version options:NSNumericSearch]; return (result == NSOrderedDescending || result == NSOrderedSame); } @end 

 if([[UIDevice currentDevice] iOSVersionIsAtLeast:@"6.0"]) self.navigationBar.shadowImage = [UIImage new]; 
 #define isIOS7 ([[[UIDevice currentDevice]systemVersion]floatValue] > 6.9) ?1 :0