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

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

[[UIDevice currentDevice].systemVersion floatValue]

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

if (version > 3.1.3) { }

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

Ответы [ 36 ]

1048 голосов
/ 17 марта 2011
/*
 *  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")) {
    ...
}
953 голосов
/ 27 июля 2010

Быстрый ответ…

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

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

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 на 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).

249 голосов
/ 06 августа 2013

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

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    // here you go with iOS 7
}
87 голосов
/ 08 июня 2017

Запуск Xcode 9, в Objective-C :

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

Запуск Xcode 7, в Swift :

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
}

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

36 голосов
/ 19 сентября 2014

Используется для проверки совместимости версии 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
}
36 голосов
/ 27 июля 2010

Попробуйте:

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

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

В 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 - 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 на 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 .

8 голосов
/ 15 марта 2015

Я всегда храню их в своем файле Constants.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)
6 голосов
/ 20 ноября 2012
+(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;
  }


}
6 голосов
/ 03 апреля 2013

С версией класса, который содержится в проекте nv-ios-version (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 / пу-КСН-версия

Блог: Получите и сравните версию iOS во время выполнения с классом Версии
Получите и сравните версию iOS во время выполнения с классом Версии

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