在运行时检查iOS版本?

时间:2010-10-05 10:49:52

标签: iphone objective-c cocoa-touch

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

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

11 个答案:

答案 0 :(得分: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         

}

答案 1 :(得分:51)

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

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

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

答案 2 :(得分:19)

符合系统定义

中指定的版本

// #define __IPHONE_2_0 20000
// #define __IPHONE_2_1 20100
// #define __IPHONE_2_2 20200
//#define __IPHONE_3_0 30000
// #define __IPHONE_3_1 30100
// #define __IPHONE_3_2 30200
// #define __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;
}

然后你可以按如下方式使用它:

if([Toolbox getSystemVersionAsAnInteger] >= __IPHONE_4_0)
{
  //blocks
} else 
{
  //oldstyle
}

答案 3 :(得分:6)

气馁与弃用不同。

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

答案 4 :(得分:6)

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

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){

//for earlier versions

} else {

//for iOS 7

}

答案 5 :(得分:6)

这里的大多数解决方案都太过分了。您需要做的只是[[UIDevice currentDevice].systemVersion intValue]。这会自动删除小数,因此无需拆分字符串。

所以你可以检查一下:

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

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

#define IOS_VERSION [[UIDevice currentDevice].systemVersion intValue];

甚至包括您的支票:

#define IOS_8PLUS ([[UIDevice currentDevice].systemVersion intValue] >= 8)

然后你只需要这样做:

if (IOS_8PLUS) {
    // iOS 8.0 and above
} else {
    // Anything less than iOS 8.0
}

答案 6 :(得分:4)

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

斯威夫特:

if #available(iOS 9, *) {
    // iOS 9 only code
} 
else {
   // Fallback on earlier versions
}

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

Objective-C:

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

答案 7 :(得分:3)

出于我的目的,我编写了一个小型库,它抽象出底层的C调用,并提供了一个Objective-C接口。

GBDeviceDetails deviceDetails = [GBDeviceInfo deviceDetails];
if (deviceDetails.iOSVersion >= 6) {
    NSLog(@"It's running at least iOS 6");      //It's running at least iOS 6
}

除了获取当前的iOS版本外,它还会检测底层设备的硬件,并获取有关屏幕大小的信息;所有在运行时。

它在github上:GBDeviceInfo。在Apache 2下获得许可。

答案 8 :(得分:2)

将它放在Prefix.pch文件中

#define IOS_VERSION [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] firstObject] intValue]

然后你可以查看iOS版本:

if(IOS_VERSION == 8)
{
     // Hello 8!
}
else
{
     // Hello some other version!
}

当然,如果您可以使用功能检测(对您的用例有意义),您应该这样做。

答案 9 :(得分:1)

在MonoTouch中:

要使用主要版本:

UIDevice.CurrentDevice.SystemVersion.Split('.')[0]

对于次要版本使用:

UIDevice.CurrentDevice.SystemVersion.Split('.')[1]

答案 10 :(得分:1)

对上述解决方案的适应性更好,更有效:

-(CGPoint)getOsVersion
{
    static CGPoint rc = {-1,-1};
    if (rc.x == -1) {
        NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
        rc.x = [versionCompatibility[0] intValue];
        rc.y = [versionCompatibility[1] intValue];
    }
    return rc;
}

现在你可以

if ([self getOsVersion].x < 7) {
}

HTH