Как проверить версию iOS? - PullRequest
818 голосов
/ 27 июля 2010

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

[[UIDevice currentDevice].systemVersion floatValue]

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

if (version > 3.1.3) { }

Как мне этого добиться?

Ответы [ 36 ]

5 голосов
/ 07 августа 2015

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.m

#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 голосов
/ 11 июня 2014

Новый способ проверки версии системы с использованием быстрых Forget [[UIDevice currentDevice] systemVersion] и NSFoundationVersionNumber.

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

     import Foundation

     let yosemite = NSOperatingSystemVersion(majorVersion: 10, minorVersion: 10, patchVersion: 0)
     NSProcessInfo().isOperatingSystemAtLeastVersion(yosemite) // false
4 голосов
/ 24 сентября 2014

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

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

[[UIDevice currentDevice] systemVersion]

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

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

Я обнаружил, что это полезно для менеджера местоположений, где мне нужно вызвать requestWhenInUseAuthorization для iOS 8.0, но метод недоступен для iOS <8 </p>

4 голосов
/ 10 декабря 2011

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

Когда это не вариант, вам нужно быть здесь немного осторожнее, потому что [@"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
4 голосов
/ 04 октября 2013
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        // Your code here
}

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

3 голосов
/ 17 мая 2014
#define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

if (_kisiOS7) {
            NSLog(@"iOS7 or greater")
} 
else {
           NSLog(@"Less than iOS7");
}
3 голосов
/ 08 февраля 2017
#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
}       
2 голосов
/ 11 ноября 2013

Существуют версии, подобные 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
 }
2 голосов
/ 10 августа 2015

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

[[UIDevice currentDevice] systemVersion]
2 голосов
/ 23 марта 2014

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

NSString *versionString = [[UIDevice currentDevice] systemVersion];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...