Как мы можем программно определить, на какой версии iOS работает устройство?

Я хочу проверить, запускает ли пользователь приложение на iOS ниже 5.0, и отобразить метку в приложении.

Как программно определить, какая iOS работает на устройстве пользователя?

Спасибо!


person meetpd    schedule 21.10.2011    source источник
comment
Эта ссылка может помочь: jayprakashdubey.blogspot.in/2014/07 /   -  person Jayprakash Dubey    schedule 30.07.2014


Ответы (9)


Лучшая текущая версия, без необходимости иметь дело с числовым поиском в NSString, - это определить macros (см. исходный ответ: Проверить Версия iOS для iPhone)

Эти макросы действительно существуют в github, см. https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h

Нравится:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

и используйте их так:

if (SYSTEM_VERSION_LESS_THAN(@"5.0")) {
    // code here
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
    // code here
}

Устаревшая версия ниже

чтобы узнать версию ОС:

[[UIDevice currentDevice] systemVersion]

возвращает строку, которую можно превратить в int / float с помощью

-[NSString floatValue]
-[NSString intValue]

нравится

Оба значения (floatValue, intValue) будут удалены из-за своего типа, 5.0.1 станет 5.0 или 5 (float или int), для точного сравнения вам нужно будет разделить его на массив INT, который проверяет принятый ответ здесь: Проверить версию iPhone iOS

NSString *ver = [[UIDevice currentDevice] systemVersion];
int ver_int = [ver intValue];
float ver_float = [ver floatValue];

и сравните вот так

NSLog(@"System Version is %@",[[UIDevice currentDevice] systemVersion]);
NSString *ver = [[UIDevice currentDevice] systemVersion];
float ver_float = [ver floatValue];
if (ver_float < 5.0) return false;

Для синтаксиса Swift 4.0

В приведенном ниже примере просто проверяется, имеет ли устройство версию iOS11 или выше.

let systemVersion = UIDevice.current.systemVersion
if systemVersion.cgFloatValue >= 11.0 {
    //"for ios 11"
  }
else{
   //"ios below 11")
  }
person Community    schedule 21.10.2011
comment
Остерегайтесь, поскольку значение с плавающей запятой 5.0.1 равно 5. - person Michael; 29.11.2011
comment
@Michael спасибо за уведомление, я добавил ссылку на соответствующий ответ - person Marek Sebera; 11.02.2012
comment
это не лучший способ попробовать этот techpaa.com /2012/11/best-way-checking-iphone-ios-version.html - person ShivaPrasad; 02.11.2012
comment
@jeeva, спасибо, что указали на это, я добавил макросы в начало своего ответа. - person Marek Sebera; 02.11.2012
comment
почему метод systemVersion устарел? Согласно документам Apple, он не устарел, так по какой-то другой причине? - person Spencer Williams; 04.04.2013
comment
@SpencerWilliams, потому что он плохо обрабатывает второстепенные версии, этого достаточно, если вам нужно распознавать 5 из 6, но не 5.0.1 из 5.1.0 - person Marek Sebera; 04.04.2013
comment
Привет, это проверено на работу с iOS 7? Спасибо. - person brain56; 07.10.2013
comment
@ brain56 со всеми уловами, которые у него есть (см. исходную связанную ветку ответов) да, он работает под iOS7 - person Marek Sebera; 07.10.2013
comment
Спасибо. У меня также была возможность опробовать его, и я могу подтвердить, что решение работает для iOS 7. - person brain56; 08.10.2013
comment
Осторожно - это правильно, но относительно медленно. Я только что нашел код, основанный на этом ответе, в нижней части самого тяжелого следа в инструментах, он был вызван из scrollViewDidScroll: - очевидно, что это можно написать по-другому, но этого не было. - person Adam Eberbach; 28.10.2013
comment
@AdamEberbach Я бы предположил, что закрытое конечное логическое поле инициализируется один раз, если оно используется в какой-то часто называемой логике. Или вы узнали, как это сделать эффективнее? - person Marek Sebera; 28.10.2013
comment
NSNumericSearch будет игнорировать десятичные разряды, что означает, что что-то вроде 6.3 будет равняться большему, чем 6.10. Это также не работает, если система когда-либо вернет 6.1.2 или что-то еще с большим количеством цифр (это будет обрабатываться как значение 612 с NSNumericSearch). - person Allen Pestaluky; 07.02.2014

Обновлять

Начиная с iOS 8, мы можем использовать новый метод isOperatingSystemAtLeastVersion на NSProcessInfo

   NSOperatingSystemVersion ios8_0_1 = (NSOperatingSystemVersion){8, 0, 1};
   if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:ios8_0_1]) {
      // iOS 8.0.1 and above logic
   } else {
      // iOS 8.0.0 and below logic
   }

Помните, что это приведет к сбою в iOS 7, поскольку API не существовал до iOS 8. Если вы поддерживаете iOS 7 и ниже, вы можете безопасно выполнить проверку с помощью

if ([NSProcessInfo instancesRespondToSelector:@selector(isOperatingSystemAtLeastVersion:)]) {
  // conditionally check for any version >= iOS 8 using 'isOperatingSystemAtLeastVersion'
} else {
  // we're on iOS 7 or below
}

Оригинальный ответ iOS ‹8

Для полноты картины, вот альтернативный подход, предложенный самой Apple в Руководство по переходу на пользовательский интерфейс iOS 7, которое включает проверку версии Foundation Framework.

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
   // Load resources for iOS 6.1 or earlier
} else {
   // Load resources for iOS 7 or later
}
person Gabriele Petronella    schedule 24.09.2013
comment
На данный момент это лучший ответ, и он должен быть вверху. - person Josh Brown; 15.01.2014
comment
Меня вроде как беспокоит, что МОЖЕТ быть релиз 6.2, тогда множество кода сломается. Но да, рекомендовано Apple ... - person Niklas Berglund; 22.01.2014
comment
@NiklasBerglund согласился, хотя вероятность получения 6.2 крайне маловероятна, поскольку сама Apple рекомендует этот метод. - person Gabriele Petronella; 22.01.2014
comment
Остерегайтесь, константы для 6.1 и 6.0 имеют одинаковое значение в соответствии с этим комментарием: stackoverflow.com/questions/19990900/ - person Niklas Berglund; 22.01.2014
comment
Судя по всему, Apple еще не включила NSFoundationVersionNumbers для 7 или 7.1. Так что я не использую этот метод. - person Bob Spryn; 13.08.2014
comment
Имейте в виду, что вызов isOperatingSystemAtLeastVersion вызовет нераспознанный селектор, отправленный в исключение экземпляра в iOS 7 и ниже. - person edc1591; 24.09.2014
comment
@ ecd1591, правда. Мой ответ начинается с iOS8, но я мог бы сделать его более ясным. Сделаю это позже - person Gabriele Petronella; 25.09.2014

Я знаю, что слишком поздно отвечать на этот вопрос. Я не уверен, работает ли мой метод на младших версиях iOS (‹5.0):

NSString *platform = [UIDevice currentDevice].model;

NSLog(@"[UIDevice currentDevice].model: %@",platform);
NSLog(@"[UIDevice currentDevice].description: %@",[UIDevice currentDevice].description);
NSLog(@"[UIDevice currentDevice].localizedModel: %@",[UIDevice currentDevice].localizedModel);
NSLog(@"[UIDevice currentDevice].name: %@",[UIDevice currentDevice].name);
NSLog(@"[UIDevice currentDevice].systemVersion: %@",[UIDevice currentDevice].systemVersion);
NSLog(@"[UIDevice currentDevice].systemName: %@",[UIDevice currentDevice].systemName);

Вы можете получить следующие результаты:

[UIDevice currentDevice].model: iPhone
[UIDevice currentDevice].description: <UIDevice: 0x1cd75c70>
[UIDevice currentDevice].localizedModel: iPhone
[UIDevice currentDevice].name: Someones-iPhone002
[UIDevice currentDevice].systemVersion: 6.1.3
[UIDevice currentDevice].systemName: iPhone OS
person Yi Jiang    schedule 26.08.2013

[[UIDevice currentDevice] systemVersion];

или проверьте версию, например

Вы можете получить указанные ниже макросы здесь.

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(IOS_VERSION_3_2_0))      
{

        UIImageView *background = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cs_lines_back.png"]] autorelease];
        theTableView.backgroundView = background;

}

Надеюсь это поможет

person Arunjack    schedule 23.03.2012
comment
Макрос, который вы использовали, определен в этом ответе SO: stackoverflow.com/a/8042056/112705 - person Dan J; 17.06.2012

Марек Себера большую часть времени великолепен, но если вы похожи на меня и обнаружите, что вам нужно часто проверять версию iOS, вы не хотите постоянно запускать макрос в памяти, потому что вы испытаете очень небольшое замедление, особенно на старых устройствах.

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

if ([GlobalVariables sharedVariables].iOSVersion >= 6.0f) {
    // do something if iOS is 6.0 or greater
}

Чтобы включить эту функцию в своем приложении, используйте этот код (для iOS 5+ с использованием ARC):

GlobalVariables.h:

@interface GlobalVariables : NSObject

@property (nonatomic) CGFloat iOSVersion;

    + (GlobalVariables *)sharedVariables;

@end

GlobalVariables.m:

@implementation GlobalVariables

@synthesize iOSVersion;

+ (GlobalVariables *)sharedVariables {
    // set up the global variables as a static object
    static GlobalVariables *globalVariables = nil;
    // check if global variables exist
    if (globalVariables == nil) {
        // if no, create the global variables class
        globalVariables = [[GlobalVariables alloc] init];
        // get system version
        NSString *systemVersion = [[UIDevice currentDevice] systemVersion];
        // separate system version by periods
        NSArray *systemVersionComponents = [systemVersion componentsSeparatedByString:@"."];
        // set ios version
        globalVariables.iOSVersion = [[NSString stringWithFormat:@"%01d.%02d%02d", \
                                       systemVersionComponents.count < 1 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:0] integerValue], \
                                       systemVersionComponents.count < 2 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:1] integerValue], \
                                       systemVersionComponents.count < 3 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:2] integerValue] \
                                       ] floatValue];
    }
    // return singleton instance
    return globalVariables;
}

@end

Теперь вы можете легко проверить версию iOS без постоянного запуска макросов. В частности, обратите внимание на то, как я преобразовал [[UIDevice currentDevice] systemVersion] NSString в CGFloat, который постоянно доступен без использования каких-либо неправильных методов, которые многие уже указали на этой странице. Мой подход предполагает, что строка версии имеет формат n.nn.nn (с учетом отсутствия последующих битов) и работает для iOS5 +. При тестировании этот подход работает намного быстрее, чем постоянный запуск макроса.

Надеюсь, это поможет любому, кто столкнулся с моей проблемой!

person Anton    schedule 06.03.2013

В MonoTouch:

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

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

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

UIDevice.CurrentDevice.SystemVersion.Split('.')[1]
person callisto    schedule 16.11.2012

Чтобы получить более конкретную информацию о номере версии с разделением основной и дополнительной версии:

NSString* versionString = [UIDevice currentDevice].systemVersion;
NSArray* vN = [versionString componentsSeparatedByString:@"."];

Массив vN будет содержать основную и вспомогательную версии в виде строк, но если вы хотите провести сравнение, номера версий следует хранить как числа (целые числа). Вы можете добавить этот код, чтобы сохранить их в C-массиве * versionNumbers:

int versionNumbers[vN.count];
for (int i = 0; i < sizeof(versionNumbers)/sizeof(versionNumbers[0]); i++)
    versionNumbers[i] = [[vN objectAtIndex:i] integerValue];

* C-массивы, используемые здесь для более краткого синтаксиса.

person JohnK    schedule 03.10.2013

Простая проверка для iOS версии ниже 5 (все версии):

if([[[UIDevice currentDevice] systemVersion] integerValue] < 5){
        // do something
};
person iCode    schedule 14.08.2012
comment
Версия системы не является целым числом. - person Johan Karlsson; 27.09.2012
comment
это слишком плохо, попробуйте этот techpaa.com/ 11 ноября 2012 г. / best-way-verify-iphone-ios-version.html - person ShivaPrasad; 02.11.2012

person    schedule
comment
Самый простой подход. В Swift (UIDevice.currentDevice (). SystemVersion как NSString) .floatValue - person Stan; 19.03.2015
comment
это также сработало и в моем случае. очень проста в использовании. - person Anil Gupta; 27.12.2016
comment
// Больше 10.0f ---- if ([[[UIDevice currentDevice] systemVersion] floatValue] ›10.0f) {} - person Anil Gupta; 27.12.2016
comment
не будет работать для таких ОС, как 6.0.7 (чье значение floatValue будет равно 7), двойная десятичная точка в строке версии может нарушить значение floatValue в строках версии. - person Motti Shneor; 20.09.2019