it-swarm.com.ru

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

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

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

Спасибо!

285
meetpd

Лучшая текущая версия , без необходимости иметь дело с числовым поиском в NSString, должна определять macros (См. Оригинальный ответ: Проверьте версию iPhone iOS знак равно

Эти макросы существуют в 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")
  }
671
Marek Sebera

Обновление

Начиная с 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
}
257
Gabriele Petronella

Я знаю, что слишком поздно, чтобы ответить на этот вопрос. Я не уверен, что мой метод все еще работает на младших версиях 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
22
Yi Jiang
[[UIDevice currentDevice] systemVersion]
15
jbat100

[[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;

}

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

14
Arunjack
[[[UIDevice currentDevice] systemVersion] floatValue]
9
Bhavesh Nayi

Марек Себера великолепен в большинстве случаев, но если вы похожи на меня и обнаружите, что вам нужно часто проверять версию 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 +. В тестировании этот подход работает намного быстрее, чем постоянный запуск макроса.

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

5
Anton

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

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-массивы, используемые здесь для более краткого синтаксиса.

2
JohnK

В MonoTouch:

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

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

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

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

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

if([[[UIDevice currentDevice] systemVersion] integerValue] < 5){
        // do something
};
0
iCode