Проверить версию iOS во время выполнения? - PullRequest
45 голосов
/ 05 октября 2010

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

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

Ответы [ 11 ]

59 голосов
/ 17 февраля 2012

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

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         

}
51 голосов
/ 05 октября 2010

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

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

if ([[UIView class] respondsToSelector:@selector(animateWithDuration:animations:)]){
// animate using blocks
}
else {
// animate the "old way"
}
19 голосов
/ 05 октября 2010

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

// # 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
}
6 голосов
/ 23 октября 2014

Большинство из этих решений настолько излишни. Все, что вам нужно сделать, это [[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 голосов
/ 14 мая 2014

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

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){

//for earlier versions

} else {

//for iOS 7

}
6 голосов
/ 05 октября 2010

Не рекомендуется, не рекомендуется.

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

4 голосов
/ 15 сентября 2017

Xcode 7 добавил синтаксис available, что делает это относительно проще:

Swift:

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

Xcode 9 также добавил этот синтаксис в Objective-C

Объектив-C:

if (@available(iOS 9.0, *)) {
   // iOS 9 only code
} else {
   // Fallback on earlier versions
}
3 голосов
/ 12 ноября 2012

Для моих целей я написал крошечную библиотеку, которая абстрагирует основные вызовы 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.

2 голосов
/ 29 сентября 2014

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

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

И затем вы можете проверить версии iOS, такие как:

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

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

1 голос
/ 07 мая 2014

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

-(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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...