NSFoundationVersionNumber в iOS 11 - Как программно определить версию iOS

В предыдущих версиях iOS я использовал NSFoundationVersionNumber для определения версии iOS:

#define IS_IOS10orHIGHER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max)
#define IS_IOS9orHIGHER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_8_3)
#define IS_IOS8orHIGHER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1)
#define IS_IOS7orHIGHER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
#define IS_IOS6orHIGHER (floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_6_0)
...

Теперь я хотел бы сделать то же самое для iOS 11, но я не смог найти правильный NSFoundationVersionNumber. Документы показывают, что NSFoundationVersionNumber_iOS_9_x_Max является последним.

Итак, как правильно NSFoundationVersionNumber если используется iOS 11?

Ответ 1

Одним из назначенных способов получения версии системы является свойство systemVersion UIDevice. https://developer.apple.com/documentation/uikit/uidevice/1620043-systemversion?language=objc

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

Вы можете использовать его так:

#define IS_IOS11orHIGHER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 11.0)

Ответ 2

Если вы используете Xcode 9 или выше, вы можете использовать атрибут @available:

if (@available(iOS 11.0, *)) {
    NSLog(@"newest");
} else {
    NSLog(@"not newest");
}

В Swift это то же самое, но написано # #available вместо @available.

Причина, по которой это лучший способ сделать это, чем другие методы, заключается в том, что компилятор знает об этом и будет соответствующим образом предупреждать о доступности. Таким образом, в приведенном выше примере вы можете использовать API, которые были введены в iOS 11.0 в блоке if без предупреждения о том, что эти API недоступны для цели развертывания вашего проекта.

Ответ 3

Apple NSProcessInfo

Теперь Apple предоставляет структуру NSOperatingSystemVersion в NSProcessInfo

Вы можете использовать его с isOperatingSystemAtLeastVersion :, или просто проверьте 3 поля, чтобы точно знать, какая версия системы работает с вашим приложением.

Он доступен как для obj c, так и для swift