在运行时检查iOS版本?

fuz*_*oat 45 iphone cocoa-touch objective-c

这是我上一期的问题.我正在使用beginAnimations:context:设置动画块来动画一些UITextLabels.但是我在文档中注意到:"在iOS 4.0及更高版本中不鼓励使用此方法.您应该使用基于块的动画方法."

我的问题是我很想使用animateWithDuration:动画:(在iOS 4.0及更高版本中可用)但不想排除使用iOS 3.0的人.有没有办法在运行时检查设备的iOS版本,以便我可以决定使用哪个语句?

Art*_*sev 59

对于将来需要帮助的任何人来说,更简单的解决方案:

NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];

if ( 5 == [[versionCompatibility objectAtIndex:0] intValue] ) { /// iOS5 is installed

    // Put iOS-5 code here

} else { /// iOS4 is installed

    // Put iOS-4 code here         

}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`NSNumericSearch`比较选项;)http://stackoverflow.com/a/1990854/429521 (3认同)
  • 还应该注意的是,你应该说`if(5 <= ...)`这样,如果他们推出更新的iOs版本(即iOS6)你的应用程序仍将支持你的功能! (3认同)

Vla*_*mir 51

在许多情况下,您不需要直接检查iOS版本,而是可以检查运行时是否存在特定方法.

在您的情况下,您可以执行以下操作:

if ([[UIView class] respondsToSelector:@selector(animateWithDuration:animations:)]){
// animate using blocks
}
else {
// animate the "old way"
}
Run Code Online (Sandbox Code Playgroud)

  • 我讨厌一揽子陈述.在某些用例中,您必须检查iOS版本.我现在面对这样一个用例! (10认同)

Krz*_*cki 19

符合系统定义中指定的版本

//#定义__IPHONE_2_0 20000
//#定义__IPHONE_2_1 20100
//#定义__IPHONE_2_2 20200
//#定义__IPHONE_3_0 30000
//#定义__IPHONE_3_1 30100
//#定义__IPHONE_3_2 30200
//#定义__IPHONE_4_0 40000
你可以写这样的功能(你应该把这个版本存储在某个地方而不是每次都计算它:

+ (NSInteger) getSystemVersionAsAnInteger{
    int index = 0;
    NSInteger version = 0;

    NSArray* digits = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
    NSEnumerator* enumer = [digits objectEnumerator];
    NSString* number;
    while (number = [enumer nextObject]) {
        if (index>2) {
            break;
        }
        NSInteger multipler = powf(100, 2-index);
        version += [number intValue]*multipler;
        index++;
    }
return version;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用如下:

if([Toolbox getSystemVersionAsAnInteger] >= __IPHONE_4_0)
{
  //blocks
} else 
{
  //oldstyle
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*myP 6

气馁与弃用不同.

如果您需要支持没有基于块的方法的早期版本的iOS,使用旧方法没有任何问题(当然,只要它们没有被删除).


小智 6

您可以使用Foundation框架的版本来确定当前的系统版本.

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){

//for earlier versions

} else {

//for iOS 7

}
Run Code Online (Sandbox Code Playgroud)


Fir*_*iro 6

这里的大多数解决方案都是如此矫枉过正.你需要做的就是[[UIDevice currentDevice].systemVersion intValue].这会自动删除小数,因此无需拆分字符串.

所以你可以检查它:

if ([[UIDevice currentDevice].systemVersion intValue] >= 8) {
    // iOS 8.0 and above
} else {
    // Anything less than iOS 8.0
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下代码定义宏:

#define IOS_VERSION [[UIDevice currentDevice].systemVersion intValue];
Run Code Online (Sandbox Code Playgroud)

甚至包括你的支票:

#define IOS_8PLUS ([[UIDevice currentDevice].systemVersion intValue] >= 8)
Run Code Online (Sandbox Code Playgroud)

那你只需要做:

if (IOS_8PLUS) {
    // iOS 8.0 and above
} else {
    // Anything less than iOS 8.0
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*die 6

Xcode 7添加了available语法,使它相对更简单:

迅速:

if #available(iOS 9, *) {
    // iOS 9 only code
} 
else {
   // Fallback on earlier versions
}
Run Code Online (Sandbox Code Playgroud)

Xcode 9还将此语法添加到了Objective-C

目标C:

if (@available(iOS 9.0, *)) {
   // iOS 9 only code
} else {
   // Fallback on earlier versions
}
Run Code Online (Sandbox Code Playgroud)