如何定义预处理宏以检查iOS版本

7

我使用它来检查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

什么也没有发生。这里出了什么问题吗?


你想检查你的应用程序用户是否正在运行iOS 5吗?如果是,你需要像James的方法一样。预处理器宏在这方面无法帮助你,因为它在编译时运行。 - Chris Devereux
你的代码中没有运行时检查,那么它怎么知道当前的iOS版本呢?你所做的只是检查你的代码编译时使用的SDK版本。 - Mike Weller
抱歉 @MikeWeller(和Chris),恐怕你们都不正确。如果编译时条件得到满足,该宏确实会创建一个运行时检查。OP只是错误地调用了该宏。请参见此处以获取有关其工作原理的完整说明:http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html - followben
6个回答

15

简单来说:

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

1
这种方法的缺点是你不能在代码块之外使用它,例如在头文件中等。 - eremzeit

10
#ifdef __IPHONE_5_0 

只需要查找这个常量。所有的Objective-C常量都以双下划线开头。


这是一个预处理器宏,意味着它在应用程序编译时执行,而不是在用户设备上执行。此外,正确答案已经在近一年前被选择了... - kirb
这个宏在编译时用于使用 #ifdef#ifndef 分离代码,而所有其他答案仅能使用 if 语句在运行时获得。 - Itachi

5

定义这个方法:

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

然后将宏定义为该方法。

如果当前操作系统版本大于等于5.0,NSOrderedAscending会使该方法返回false。您应该使用NSOrderedDescending。 - matzahboy

5
您已经定义了一个宏,但是您正在非宏的方式中使用它。尝试像这样做,使用您相同的宏定义。
IF_IOS5_OR_GREATER(NSLog(@"iOS5");)

(这是替代您的#if/#endif块的方法。)

你能帮我一下吗:http://stackoverflow.com/q/21275316/434898。谢谢。 - Ajay Sharma

2

对于运行时检查,请使用类似以下的代码:

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

如果您在UIDevice上创建一个类别,您可以像这样使用它:
@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];

1
#define isIOS7 ([[[UIDevice currentDevice]systemVersion]floatValue] > 6.9) ?1 :0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接