Как проверить версию iOS?

Я хочу проверить, если iOS версия устройства больше, чем 3.1.3 Я пробовал такие вещи, как:

[[UIDevice currentDevice].systemVersion floatValue]

но это не работает, я просто хочу:

if (version > 3.1.3) { }

как я могу этого достичь?

30 ответов


быстрый ответ ...


Начиная с Swift 2.0, вы можете использовать #available на if или guard для защиты кода, который должен выполняться только в определенных системах.

if #available(iOS 9, *) {}


В Objective-C необходимо проверить версию системы и выполнить сравнение.

[[NSProcessInfo processInfo] operatingSystemVersion] в iOS 8 и выше.

по состоянию на Xcode 9:

if (@available(iOS 9, *)) {}


полный ответ ...

в Objective-C и Swift в редких случаях лучше не полагаться на версию операционной системы в качестве индикатора возможностей устройства или ОС. Обычно существует более надежный метод проверки наличия конкретного объекта или класса.

Проверка наличия API:

например, вы можете проверить, если UIPopoverController доступно на текущем устройстве, используя NSClassFromString:

if (NSClassFromString(@"UIPopoverController")) {
    // Do something
}

для слабо связанные классы, безопасно отправлять сообщения классу напрямую. Примечательно, что это работает для фреймворков, которые явно не связаны как "обязательные". Для отсутствующих классов выражение принимает значение nil, при невыполнении условия:

if ([LAContext class]) {
    // Do something
}

некоторые классы, такие как CLLocationManager и UIDevice, предоставляют методы для проверки возможностей устройства:

if ([CLLocationManager headingAvailable]) {
    // Do something
}

проверка на наличие символов:

очень иногда, вы должны проверить наличие постоянный. Это появилось в iOS 8 с введением UIApplicationOpenSettingsURLString, используется для загрузки настроек приложения через -openURL:. Значение не существовало до iOS 8. Передача nil в этот API приведет к сбою, поэтому вы должны сначала убедиться в существовании константы:

if (&UIApplicationOpenSettingsURLString != NULL) {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}

сравнение с версией операционной системы:

предположим, вы столкнулись с относительно редкой необходимостью проверить версию операционной системы. Для проектов, ориентированных на iOS 8 и выше, NSProcessInfo включает в себя метод для выполнения сравнения версий с меньшим шансом ошибки:

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

проекты, ориентированные на старые системы, могут использовать systemVersion on UIDevice. Apple использует его в своих GLSprite пример кода.

// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
    displayLinkSupported = TRUE;
}

если по какой-то причине вы решите, что systemVersion это то, что вы хотите, не забудьте обработать его как строку или вы рискуете усечь номер версии исправления (например. 3.1.2 -> 3.1).


/*
 *  System Versioning Preprocessor Macros
 */ 

#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)

/*
 *  Usage
 */ 

if (SYSTEM_VERSION_LESS_THAN(@"4.0")) {
    ...
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {
    ...
}

как было предложено официальные документы Apple можно использовать NSFoundationVersionNumber С NSObjCRuntime.h заголовочный файл.

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    // here you go with iOS 7
}

запуск Xcode 9, в С:

if (@available(iOS 11, *)) {
    // iOS 11 (or newer) ObjC code
} else {
    // iOS 10 or older code
}

запуск Xcode 7, в Свифт:

if #available(iOS 11, *) {
    // iOS 11 (or newer) Swift code
} else {
    // iOS 10 or older code
}

для версии вы можете указать основной, минорный или патч (см. http://semver.org/ для определений). Примеры:

  • iOS 11 и iOS 11.0 являются той же минимальной версией
  • iOS 10, iOS 10.3, iOS 10.3.1 разные минимальный версии

вы можете ввести значения для любой из этих систем:

  • iOS, macOS, watchOS, tvOS

пример реального случая взят из один из моих стручков:

if #available(iOS 10.0, tvOS 10.0, *) {
    // iOS 10+ and tvOS 10+ Swift code
} else {
    // iOS 9 and tvOS 9 older code
}

документация


попробуй:

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending) {
    // OS version >= 3.1.3
} else {
    // OS version < 3.1.3
}

это используется для проверки совместимой версии SDK в Xcode, это если у вас есть большая команда с разными версиями Xcode или несколькими проектами, поддерживающими разные SDK, которые имеют один и тот же код:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
  //programming in iOS 8+ SDK here
#else
  //programming in lower than iOS 8 here   
#endif

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

if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
  //older than iOS 8 code here
} else {
  //iOS 8 specific code here
}

Swift версия:

if let version = Float(UIDevice.current.systemVersion), version < 9.3 {
    //add lower than 9.3 code here
} else {
    //add 9.3 and above code here
}

текущие версии swift должны использовать это:

if #available(iOS 12, *) {
    //iOS 12 specific code here
} else {
    //older than iOS 12 code here
}

Предпочтительный Подход

в Swift 2.0 Apple добавила проверку доступности, используя гораздо более удобный синтаксис (Подробнее здесь). Теперь вы можете проверить версию ОС с более чистым синтаксисом:

if #available(iOS 9, *) {
    // Then we are on iOS 9
} else {
    // iOS 8 or earlier
}

это предпочтительнее, чем проверка respondsToSelector и т. д. (что нового в Swift). Теперь компилятор всегда будет предупреждать вас, если вы не защищаете свой код должным образом.


Pre Swift 2.0

новое в iOS 8 is NSProcessInfo С учетом лучшей семантической проверки версий.

развертывание на iOS 8 и выше

для минимальных целей развертывания iOS 8.0 или выше, используйте NSProcessInfo operatingSystemVersion или isOperatingSystemAtLeastVersion.

это дало бы следующее:

let minimumVersion = NSOperatingSystemVersion(majorVersion: 8, minorVersion: 1, patchVersion: 2)
if NSProcessInfo().isOperatingSystemAtLeastVersion(minimumVersion) {
    //current version is >= (8.1.2)
} else {
    //current version is < (8.1.2)
}

развертывание на iOS 7

для минимальных целей развертывания iOS 7.1 или ниже, используйте сравнение с NSStringCompareOptions.NumericSearch on UIDevice systemVersion.

это даст:

let minimumVersionString = "3.1.3"
let versionComparison = UIDevice.currentDevice().systemVersion.compare(minimumVersionString, options: .NumericSearch)
switch versionComparison {
    case .OrderedSame, .OrderedDescending:
        //current version is >= (3.1.3)
        break
    case .OrderedAscending:
        //current version is < (3.1.3)
        fallthrough
    default:
        break;
}

чтение на NSHipster.


рекомендую:

if ([[[UIDevice currentDevice] systemVersion] floatValue] > 3.13) {
    ; // ...
}

фото: Как выбрать конкретную версию iPhone?


Я всегда держу их в своих константах.H-файл:

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) 
#define IS_OS_5_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0)
#define IS_OS_6_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0)
#define IS_OS_7_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
#define IS_OS_8_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

+(BOOL)doesSystemVersionMeetRequirement:(NSString *)minRequirement{

// eg  NSString *reqSysVer = @"4.0";


  NSString *currSysVer = [[UIDevice currentDevice] systemVersion];

  if ([currSysVer compare:minRequirement options:NSNumericSearch] != NSOrderedAscending)
  {
    return YES;
  }else{
    return NO;
  }


}

С версия класс, который содержится в nv-ios-версия project (Apache License, версия 2.0), легко получить и сравнить версию iOS. Ниже пример кода выводит версию iOS и проверяет, является ли версия больше или равна 6.0.

// Get the system version of iOS at runtime.
NSString *versionString = [[UIDevice currentDevice] systemVersion];

// Convert the version string to a Version instance.
Version *version = [Version versionWithString:versionString];

// Dump the major, minor and micro version numbers.
NSLog(@"version = [%d, %d, %d]",
    version.major, version.minor, version.micro);

// Check whether the version is greater than or equal to 6.0.
if ([version isGreaterThanOrEqualToMajor:6 minor:0])
{
    // The iOS version is greater than or equal to 6.0.
}

// Another way to check whether iOS version is
// greater than or equal to 6.0.
if (6 <= version.major)
{
    // The iOS version is greater than or equal to 6.0.
}

Страница Проекта: nv-ios-версия
TakahikoKawasaki / nv-ios-версия

блог: получить и сравнить версию iOS во время выполнения с Класс версии
получить и сравнить версию iOS во время выполнения с классом версии


новый способ проверить версию системы с помощью swift Forget [[UIDevice currentDevice] systemVersion] и NSFoundationVersionNumber.

мы можем использовать NSProcessInfo-isOperatingSystemAtLeastVersion

     import Foundation

     let yosemite = NSOperatingSystemVersion(majorVersion: 10, minorVersion: 10, patchVersion: 0)
     NSProcessInfo().isOperatingSystemAtLeastVersion(yosemite) // false

UIDevice+IOSVersion.h

@interface UIDevice (IOSVersion)

+ (BOOL)isCurrentIOSVersionEqualToVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionGreaterThanVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionGreaterThanOrEqualToVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionLessThanVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionLessThanOrEqualToVersion:(NSString *)iOSVersion

@end

UIDevice+IOSVersion.м

#import "UIDevice+IOSVersion.h"

@implementation UIDevice (IOSVersion)

+ (BOOL)isCurrentIOSVersionEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedSame;
}

+ (BOOL)isCurrentIOSVersionGreaterThanVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedDescending;
}

+ (BOOL)isCurrentIOSVersionGreaterThanOrEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] != NSOrderedAscending;
}

+ (BOOL)isCurrentIOSVersionLessThanVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedAscending;
}

+ (BOOL)isCurrentIOSVersionLessThanOrEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] != NSOrderedDescending;
}

@end

в общем, лучше спросить, Может ли объект выполнить данный селектор, а не проверять номер версии, чтобы решить, должен ли он присутствовать.

когда это не вариант, вам нужно быть немного осторожным здесь, потому что [@"5.0" compare:@"5" options:NSNumericSearch] возвращает NSOrderedDescending что вполне может быть вовсе не намеренно; я мог бы ожидать NSOrderedSame здесь. Это, по крайней мере, теоретическая проблема, от которой, на мой взгляд, стоит защищаться.

также стоит рассмотреть возможность плохой ввод версии, с которым нельзя разумно сравнивать. Apple поставляет три предопределенные константы NSOrderedAscending, NSOrderedSame и NSOrderedDescending но я могу придумать то, что называется NSOrderedUnordered в случае, если я не могу сравнить две вещи, и я хочу вернуть значение, указывающее на это.

более того, не исключено, что Apple когда-нибудь расширит свои три предопределенные константы, чтобы разрешить различные возвращаемые значения, делая сравнение != NSOrderedAscending неумно.

С этим сказал, рассмотрим следующий код.

typedef enum {kSKOrderedNotOrdered = -2, kSKOrderedAscending = -1, kSKOrderedSame = 0, kSKOrderedDescending = 1} SKComparisonResult;

@interface SKComparator : NSObject
+ (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo;
@end

@implementation SKComparator
+ (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo {
  if (!vOne || !vTwo || [vOne length] < 1 || [vTwo length] < 1 || [vOne rangeOfString:@".."].location != NSNotFound ||
    [vTwo rangeOfString:@".."].location != NSNotFound) {
    return SKOrderedNotOrdered;
  }
  NSCharacterSet *numericalCharSet = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"];
  NSString *vOneTrimmed = [vOne stringByTrimmingCharactersInSet:numericalCharSet];
  NSString *vTwoTrimmed = [vTwo stringByTrimmingCharactersInSet:numericalCharSet];
  if ([vOneTrimmed length] > 0 || [vTwoTrimmed length] > 0) {
    return SKOrderedNotOrdered;
  }
  NSArray *vOneArray = [vOne componentsSeparatedByString:@"."];
  NSArray *vTwoArray = [vTwo componentsSeparatedByString:@"."];
  for (NSUInteger i = 0; i < MIN([vOneArray count], [vTwoArray count]); i++) {
    NSInteger vOneInt = [[vOneArray objectAtIndex:i] intValue];
    NSInteger vTwoInt = [[vTwoArray objectAtIndex:i] intValue];
    if (vOneInt > vTwoInt) {
      return kSKOrderedDescending;
    } else if (vOneInt < vTwoInt) {
      return kSKOrderedAscending;
    }
  }
  if ([vOneArray count] > [vTwoArray count]) {
    for (NSUInteger i = [vTwoArray count]; i < [vOneArray count]; i++) {
      if ([[vOneArray objectAtIndex:i] intValue] > 0) {
        return kSKOrderedDescending;
      }
    }
  } else if ([vOneArray count] < [vTwoArray count]) {
    for (NSUInteger i = [vOneArray count]; i < [vTwoArray count]; i++) {
      if ([[vTwoArray objectAtIndex:i] intValue] > 0) {
        return kSKOrderedAscending;
      }
    }
  }
  return kSKOrderedSame;
}
@end

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        // Your code here
}

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


немного поздно на вечеринку, но в свете iOS 8.0 это может быть актуально:

Если вы можете избегать использования

[[UIDevice currentDevice] systemVersion]

вместо этого проверьте наличие метода / класса / чего-либо еще.

if ([self.yourClassInstance respondsToSelector:@selector(<yourMethod>)]) 
{ 
    //do stuff 
}

Я нашел, что это полезно для менеджера местоположения, где я должен вызвать requestWhenInUseAuthorization для iOS 8.0, но метод недоступен для iOS


#define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

if (_kisiOS7) {
            NSLog(@"iOS7 or greater")
} 
else {
           NSLog(@"Less than iOS7");
}

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

затем добавьте условие if следующим образом: -

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {
   //Your code
}       

есть версия, как 7.0 или 6.0.3, поэтому мы можем просто конвертировать версию в цифры для сравнения. если версия похожа на 7.0, просто добавьте другую ".0" на нем, а затем принять его числовое значение.

 int version;
 NSString* iosVersion=[[UIDevice currentDevice] systemVersion];
 NSArray* components=[iosVersion componentsSeparatedByString:@"."];
 if ([components count]==2) {
    iosVersion=[NSString stringWithFormat:@"%@.0",iosVersion];

 }
 iosVersion=[iosVersion stringByReplacingOccurrencesOfString:@"." withString:@""];
 version=[iosVersion integerValue];

для 6.0.0

  if (version==600) {
    // Do something
  }

для 7.0

 if (version==700) {
   // Do something
 }

попробуйте следующий код:

NSString *versionString = [[UIDevice currentDevice] systemVersion];

только для получения строкового значения версии ОС:

[[UIDevice currentDevice] systemVersion]

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

использование:

if (systemVersion(LessThan, @"5.0")) ...

.H-файл:

typedef enum {
  LessThan,
  LessOrEqual,
  Equal,
  GreaterOrEqual,
  GreaterThan,
  NotEqual
} Comparison;

BOOL systemVersion(Comparison test, NSString* version);

.файл м:

BOOL systemVersion(Comparison test, NSString* version) {
  NSComparisonResult result = [[[UIDevice currentDevice] systemVersion] compare: version options: NSNumericSearch];
  switch (test) {
    case LessThan:       return result == NSOrderedAscending;
    case LessOrEqual:    return result != NSOrderedDescending;
    case Equal:          return result == NSOrderedSame;
    case GreaterOrEqual: return result != NSOrderedAscending;
    case GreaterThan:    return result == NSOrderedDescending;
    case NotEqual:       return result != NSOrderedSame;
  }
}

вы должны добавить префикс приложения к именам, особенно к Comparison тип.


Я знаю, что это старый вопрос, но кто-то должен был упомянуть макросы времени компиляции в Availability.h. Все остальные методы здесь являются решениями среды выполнения и не будут работать в файле заголовка, категории класса или определении ivar.

для этих ситуаций, используйте

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_6_0
  // iOS 6+ code here
#else
  // Pre iOS 6 code here
#endif

h / t этой ответ


используя refered порекомендованный путь... если в заголовочных файлах нет определения, вы всегда можете получить версию, печатающую ее на консоли с устройством желаемой версии IOS.

- (BOOL) isIOS8OrAbove{
    float version802 = 1140.109985;
    float version8= 1139.100000; // there is no def like NSFoundationVersionNumber_iOS_7_1 for ios 8 yet?
    NSLog(@"la version actual es [%f]", NSFoundationVersionNumber);
    if (NSFoundationVersionNumber >= version8){
        return true;
    }
    return false;
}

решение для проверки версии iOS в Swift

switch (UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch)) {
    case .OrderedAscending:
       println("iOS < 8.0")

    case .OrderedSame, .OrderedDescending:
       println("iOS >= 8.0")
}

Con этого решения: это просто плохая практика, чтобы проверить номера версий ОС, как бы вы это ни делали. Таким образом, никогда не следует жестко проверять зависимости кода, всегда проверять наличие функций, возможностей или наличие класса. Подумайте об этом; Apple может выпустить обратно совместимую версию класса, если они это сделали, то код, который вы предлагаете, никогда не будет использовать его, поскольку ваша логика ищет версию ОС число, а не существование класса.

(источник информации)

решение для проверки существования класса в Swift

if (objc_getClass("UIAlertController") == nil) {
   // iOS 7
} else {
   // iOS 8+
}

не используйте if (NSClassFromString("UIAlertController") == nil) потому что он работает правильно на симуляторе iOS с помощью iOS 7.1 и 8.2, но если вы тестируете на реальном устройстве с помощью iOS 7.1, вы, к сожалению, заметите, что вы никогда не пройдете через другую часть фрагмента кода.


#define IsIOS8 (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)

более общая версия в Obj-C++ 11 (вы, вероятно, могли бы заменить некоторые из этих вещей функциями NSString/C, но это менее подробно. Это дает вам два механизма. splitSystemVersion дает вам массив всех частей, который полезен, если вы просто хотите включить основную версию (например,switch([self splitSystemVersion][0]) {case 4: break; case 5: break; }).

#include <boost/lexical_cast.hpp>

- (std::vector<int>) splitSystemVersion {
    std::string version = [[[UIDevice currentDevice] systemVersion] UTF8String];
    std::vector<int> versions;
    auto i = version.begin();

    while (i != version.end()) {
        auto nextIllegalChar = std::find_if(i, version.end(), [] (char c) -> bool { return !isdigit(c); } );
        std::string versionPart(i, nextIllegalChar);
        i = std::find_if(nextIllegalChar, version.end(), isdigit);

        versions.push_back(boost::lexical_cast<int>(versionPart));
    }

    return versions;
}

/** Losslessly parse system version into a number
 * @return <0>: the version as a number,
 * @return <1>: how many numeric parts went into the composed number. e.g.
 * X.Y.Z = 3.  You need this to know how to compare again <0>
 */
- (std::tuple<int, int>) parseSystemVersion {
    std::string version = [[[UIDevice currentDevice] systemVersion] UTF8String];
    int versionAsNumber = 0;
    int nParts = 0;

    auto i = version.begin();
    while (i != version.end()) {
        auto nextIllegalChar = std::find_if(i, version.end(), [] (char c) -> bool { return !isdigit(c); } );
        std::string versionPart(i, nextIllegalChar);
        i = std::find_if(nextIllegalChar, version.end(), isdigit);

        int part = (boost::lexical_cast<int>(versionPart));
        versionAsNumber = versionAsNumber * 100 + part;
        nParts ++;
    }

    return {versionAsNumber, nParts};
}


/** Assume that the system version will not go beyond X.Y.Z.W format.
 * @return The version string.
 */
- (int) parseSystemVersionAlt {
    std::string version = [[[UIDevice currentDevice] systemVersion] UTF8String];
    int versionAsNumber = 0;
    int nParts = 0;

    auto i = version.begin();
    while (i != version.end() && nParts < 4) {
        auto nextIllegalChar = std::find_if(i, version.end(), [] (char c) -> bool { return !isdigit(c); } );
        std::string versionPart(i, nextIllegalChar);
        i = std::find_if(nextIllegalChar, version.end(), isdigit);

        int part = (boost::lexical_cast<int>(versionPart));
        versionAsNumber = versionAsNumber * 100 + part;
        nParts ++;
    }

    // don't forget to pad as systemVersion may have less parts (i.e. X.Y).
    for (; nParts < 4; nParts++) {
        versionAsNumber *= 100;
    }

    return versionAsNumber;
}

попробуй такое

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { 
// do some work
}

float deviceOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
float versionToBeCompared = 3.1.3; //(For Example in your case)

if(deviceOSVersion < versionToBeCompared)
   //Do whatever you need to do. Device version is lesser than 3.1.3(in your case)
else 
   //Device version should be either equal to the version you specified or above

Swift пример, который на самом деле работает:

switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {
case .OrderedSame, .OrderedDescending:
    println("iOS >= 8.0")
case .OrderedAscending:
    println("iOS < 8.0")
}

Не используйте NSProcessInfo, потому что он не работает под 8.0, поэтому его практически бесполезно до 2016