Я хочу проверить, больше ли iOS
версия устройства, чем 3.1.3
я пробовал, например:
[[UIDevice currentDevice].systemVersion floatValue]
но это не работает, я просто хочу:
if (version > 3.1.3) { }
Как мне этого добиться?
ios
objective-c
Джон
источник
источник
if #available(iOS 9, *) {}
в Swift. Начиная Xcode 9,if (@available(iOS 11, *)) {}
в цель-c.Ответы:
Быстрый ответ ...
По 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
:Для слабосвязанных классов безопасно отправлять сообщения классу напрямую. Примечательно, что это работает для фреймворков, которые явно не связаны как «Обязательные». Для отсутствующих классов выражение оценивается как ноль, выполняя условие:
Некоторые классы, такие как
CLLocationManager
иUIDevice
, предоставляют методы для проверки возможностей устройства:Проверка на наличие символов:
Очень редко вы должны проверять наличие постоянной. Это появилось в iOS 8 с введением
UIApplicationOpenSettingsURLString
, используемым для загрузки приложения настроек через-openURL:
. Это значение не существовало до iOS 8. Передача nil в этот API приведет к сбою, поэтому сначала необходимо убедиться, что константа существует:Сравнение с версией операционной системы:
Предположим, вы столкнулись с относительно редкой необходимостью проверки версии операционной системы. Для проектов, ориентированных на iOS 8 и выше,
NSProcessInfo
включает метод для сравнения версий с меньшей вероятностью ошибки:Проекты, ориентированные на более старые системы, можно использовать
systemVersion
наUIDevice
. Apple использует его в своем примере кода GLSprite .Если по какой-либо причине вы решили, что
systemVersion
это именно то, что вам нужно, убедитесь, что вы воспринимаете это как строку, иначе вы рискуете урезать номер редакции патча (например, 3.1.2 -> 3.1).источник
-viewWillAppear
вUISplitViewController
. Мой взлом состоит в том, чтобы определить, является ли <iOS 4.0, и отправить его в контроллер подробного вида самостоятельно в Root View-didSelectRowAtIndexPath
.[@"10.0" compare:@"10" options:NSNumericSearch]
возвращаетсяNSOrderedDescending
, что вполне может быть не предназначено вообще. (Я мог бы ожидатьNSOrderedSame
.) Это, по крайней мере, теоретическая возможность.respondsToSelector
и др. не справились бы с этой задачей - должны сравнивать версии.NSFoundationVersionNumber
и только, если это невозможно, если вы проверяете версии системыUIDevice
.источник
.0
номеров. НапримерSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0.0")
дает неверный результат на iOS 7.0.В соответствии с официальными документами Apple : вы можете использовать
NSFoundationVersionNumber
, изNSObjCRuntime.h
заголовочного файла.источник
NSFoundationVersionNumber_iOS_6_1
не существует в iOS 5 SDK.#ifndef NSFoundationVersionNumber_iOS_7_0 #define NSFoundationVersionNumber_iOS_7_0 1047.00 #endif
. Чтобы избежать подобных ошибок, я пошел с макросом SYSTEM_VERSION_LESS_THAN (v) из yasirmturkNSFoundationVersionNumber_iOS_8_0
в iOS 9. просто проверьтеNSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1
Начиная Xcode 9, в Objective-C :
Начиная Xcode 7, в Swift :
Для версии вы можете указать MAJOR, MINOR или PATCH (определения см. В http://semver.org/ ). Примеры:
iOS 11
иiOS 11.0
одинаковая минимальная версияiOS 10
,iOS 10.3
,iOS 10.3.1
Различные минимальные версииВы можете ввести значения для любой из этих систем:
iOS
,macOS
,watchOS
,tvOS
Пример реального случая взят из одного из моих модулей :
документация
источник
if (...) {} else { ... }
guard
в Objective-C вместо того, чтобы оставить блок открытым и отступ вelse
операторе?if
блок с последующимelse
.if
блоков.Это используется для проверки совместимости версии SDK в XCode, это если у вас большая команда с разными версиями XCode или несколько проектов, поддерживающих разные SDK с одинаковым кодом:
Что вы действительно хотите, чтобы проверить версию iOS на устройстве. Вы можете сделать это с этим:
Swift версия:
Текущие версии Swift должны использовать это:
источник
Пытаться:
источник
Предпочитаемый подход
В Swift 2.0 Apple добавила проверку доступности с использованием гораздо более удобного синтаксиса (подробнее здесь ). Теперь вы можете проверить версию ОС с более чистым синтаксисом:
Это предпочтительнее, чем проверка и
respondsToSelector
т. Д. ( Что нового в Swift ). Теперь компилятор всегда предупредит вас, если вы не будете правильно защищать свой код.Pre Swift 2.0
Новое в iOS 8
NSProcessInfo
позволяет улучшить семантические проверки версий.Развертывание на iOS 8 и выше
Это даст следующее:
Развертывание на iOS 7
Это даст:
Больше чтения в NSHipster .
источник
Я всегда храню их в своем файле Constants.h:
источник
.pch
файл вашего проекта XCodeConstants.h
файл, который импортируется в мойpch
файл.источник
С классом Version, который содержится в проекте nv-ios-version (Apache License, версия 2.0), легко получить и сравнить версию iOS. Приведенный ниже пример кода выводит версию iOS и проверяет, больше или равна версия 6.0.
Страница проекта: nv-ios-версия
ТакахикоКавасаки / nv-ios-версия
Блог: Получить и сравнить версию iOS во время выполнения с классом Версии
Получить и сравнить версию iOS во время выполнения с классом Версии
источник
Новый способ проверки версии системы с использованием быстрых Forget [[UIDevice currentDevice] systemVersion] и NSFoundationVersionNumber.
Мы можем использовать NSProcessInfo -isOperatingSystemAtLeastVersion
источник
UIDevice + IOSVersion.h
UIDevice + IOSVersion.m
источник
В общем случае лучше спросить, может ли объект выполнить данный селектор, чем проверять номер версии, чтобы решить, должен ли он присутствовать.
Когда это не вариант, вам нужно быть немного осторожнее, потому что
[@"5.0" compare:@"5" options:NSNumericSearch]
возвратыNSOrderedDescending
могут быть совсем не предназначены; Я мог бы ожидатьNSOrderedSame
здесь. По крайней мере, это теоретическая проблема, от которой, на мой взгляд, стоит защищаться.Стоит также рассмотреть возможность ввода неверной версии, с которой невозможно сравнивать. Apple , поставляет три предопределенных констант
NSOrderedAscending
,NSOrderedSame
и ,NSOrderedDescending
но я могу думать о использовании некоторой вещи под названиемNSOrderedUnordered
в том случае , я не могу сравнить две вещи , и я хочу , чтобы вернуть значение , указывающее это.Более того, не исключено, что Apple когда-нибудь расширит свои три предопределенные константы, чтобы разрешить множество возвращаемых значений, делая сравнение
!= NSOrderedAscending
неразумным.С учетом сказанного рассмотрим следующий код.
источник
Где, конечно,
NSFoundationVersionNumber_iOS_6_1
должен быть изменен на подходящий для версии iOS, которую вы хотите проверить. То, что я сейчас написал, вероятно, будет часто использоваться при тестировании устройства под управлением iOS7 или предыдущей версии.источник
немного поздно для вечеринки, но в свете iOS 8.0 это может быть актуально:
если вы можете избежать использования
[[UIDevice currentDevice] systemVersion]
Вместо этого проверьте наличие метода / класса / чего-либо еще.
Я обнаружил, что это полезно для менеджера местоположений, где мне нужно вызвать requestWhenInUseAuthorization для iOS 8.0, но этот метод недоступен для iOS <8
источник
источник
Я знаю, что это старый вопрос, но кто-то должен был упомянуть макросы времени компиляции
Availability.h
. Все остальные методы здесь являются решениями времени выполнения и не будут работать в заголовочном файле, категории класса или определении ivar.Для этих ситуаций используйте
ч / т этот ответ
источник
Затем добавьте условие if следующим образом:
источник
Существуют версии, подобные 7.0 или 6.0.3, поэтому мы можем просто конвертировать версию в цифры для сравнения. если версия похожа на 7.0, просто добавьте к ней еще один «.0» и затем примите его числовое значение.
Для 6.0.0
за 7.0
источник
6.1.10
. тогда этот алгоритм даст6110 > 700
, что не правильно.Попробуйте следующий код:
источник
Просто для получения строкового значения версии ОС:
источник
В качестве варианта решения yasimturks я определил одну функцию и несколько значений enum вместо пяти макросов. Я нахожу это более элегантным, но это вопрос вкуса.
Применение:
.h файл:
.m файл:
Вы должны добавить префикс вашего приложения к именам, особенно к
Comparison
типу.источник
Используя рекомендованный рекомендуемый способ ... если в заголовочных файлах нет определения, вы всегда можете получить версию, распечатав ее на консоли с устройством нужной версии IOS.
источник
Решение для проверки версии iOS в Swift
Недостаток этого решения: это просто плохая практика - сверяться с номерами версий ОС, в зависимости от того, как вы это делаете. Никогда не следует жестко кодировать зависимости таким образом, всегда проверять возможности, возможности или существование класса. Учти это; Apple может выпустить обратно совместимую версию класса, если они это сделают, то предлагаемый вами код никогда не будет использовать ее, поскольку ваша логика ищет номер версии ОС, а НЕ существование класса.
( Источник этой информации )
Решение для проверки существования класса в Swift
Не используйте,
if (NSClassFromString("UIAlertController") == nil)
потому что он работает правильно на симуляторе iOS с использованием iOS 7.1 и 8.2, но если вы тестируете на реальном устройстве с iOS 7.1, вы, к сожалению, заметите, что вы никогда не пройдете через остальную часть фрагмента кода.источник
источник
Более общая версия в Obj-C ++ 11 (возможно, вы могли бы заменить некоторые из этих функций на функции NSString / C, но это менее многословно. Это дает вам два механизма. SplitSystemVersion дает вам массив всех частей, что полезно, если Вы просто хотите включить основную версию (например
switch([self splitSystemVersion][0]) {case 4: break; case 5: break; }
).источник
Попробуй это
источник
источник
float versionToBeCompared = 3.1.3;
не могу даже скомпилировать.Быстрый пример, который действительно работает:
Не используйте NSProcessInfo, потому что он не работает под 8.0, так что до 2016 года он практически бесполезен
источник
Вот быстрая версия:
Применение:
источник
struct iOSVersion { static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue static let iOS7 = (iOSVersion.SYS_VERSION_FLOAT < 8.0 && iOSVersion.SYS_VERSION_FLOAT >= 7.0) static let iOS8 = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0) static let iOS9 = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0) }