Проверить версию iOS во время выполнения?

Это мой следующий вопрос. Я использую beginAnimations:context: для установки блока анимации для анимации некоторых UITextLabels. Однако в документах я заметил: "Использование этого метода не рекомендуется в iOS 4.0 и более поздних версиях. Вместо этого вы должны использовать методы анимации на основе блоков".

Мой вопрос: я бы хотел использовать animateWithDuration: анимации: (доступно в iOS 4.0 и новее), но не хочу исключать людей с помощью iOS 3.0. Есть ли способ проверить версию iOS устройства во время выполнения, чтобы я мог принять решение о том, какой оператор использовать?

Ответы

Ответ 1

Во многих случаях вам не нужно напрямую проверять версию iOS, вместо этого вы можете проверить, присутствует ли конкретный метод во время выполнения или нет.

В вашем случае вы можете сделать следующее:

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

Ответ 2

Упрощенное решение для всех, кому понадобится помощь в будущем:

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         

}

Ответ 3

чтобы соответствовать версии, указанной в системе, определяет

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

Ответ 4

Отклонено не то же самое, что и устаревшее.

Если вам нужно поддерживать более ранние версии iOS, которые не имеют основанных на блоке методов, нет ничего плохого в использовании старых методов (если они не были удалены, конечно).

Ответ 5

Вы можете использовать версию фреймворка Foundation для определения текущей версии системы.

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){

//for earlier versions

} else {

//for iOS 7

}

Ответ 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
}

Ответ 7

В моих целях я написал небольшую библиотеку, которая абстрагирует скрытые вызовы C и представляет интерфейс Objective-C.

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

Помимо получения текущей версии iOS, она также обнаруживает аппаратное обеспечение базового устройства и получает информацию о размере экрана; все во время выполнения.

Это на github: GBDeviceInfo. Лицензия под Apache 2.

Ответ 8

Поместите это в файл Prefix.pch

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

И тогда вы можете проверить версии iOS, например:

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

Отключить курс, если вы можете использовать обнаружение функции (и это имеет смысл для вашего случая использования), вы должны это сделать.

Ответ 9

XCode 7 добавил синтаксис available, сделав это относительно простым:

Swift:

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
}

Ответ 10

В MonoTouch:

Чтобы использовать основную версию:

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

Для незначительной версии используйте:

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

Ответ 11

Немного лучше и эффективнее адаптироваться к вышеуказанным решениям:

-(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) {
}

НТН