Как определить макрос препроцессора для проверки версии iOS

Я использую его для проверки версии iOS, но он не работает:

#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_5_0
#define kCFCoreFoundationVersionNumber_iPhoneOS_5_0 675.000000
#endif

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
#define IF_IOS5_OR_GREATER(...) \
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_5_0) \
{ \
__VA_ARGS__ \
}
#else
#define IF_IOS5_OR_GREATER 0
#endif

когда я делаю

#if IF_IOS5_OR_GREATER
NSLog(@"iOS5");
#endif

Ничего не произошло. Что-то здесь не так?


person Bartosz Bialecki    schedule 20.10.2011    source источник
comment
Вы хотите, чтобы это проверяло, использует ли пользователь вашего приложения iOS 5? Если это так, вам нужно что-то вроде метода Джеймса. Макрос препроцессора вам в этом не поможет, так как он запускается во время компиляции.   -  person Chris Devereux    schedule 20.10.2011
comment
В вашем коде нет проверок во время выполнения, так как же он должен знать текущую версию iOS? Все, что вы делаете, — это проверяете версию SDK, с которой был скомпилирован ваш код.   -  person Mike Weller    schedule 20.10.2011
comment
Эээ @MikeWeller (и Крис), боюсь, что ни один из вас не прав. Макрос действительно создает проверку времени выполнения, если выполняется условие времени компиляции. ОП просто неправильно вызывал макрос. Полное объяснение того, как это работает, см. здесь: cocoawithlove. .com/2010/07/   -  person followben    schedule 31.01.2012


Ответы (5)


Вы определили макрос, но используете его не как макрос. Попробуйте что-то подобное, с тем же определением макроса.

IF_IOS5_OR_GREATER(NSLog(@"iOS5");)

(Это вместо вашего блока #if/#endif.)

person Cajunluke    schedule 20.10.2011
comment
Можете ли вы мне помочь: stackoverflow.com/q/21275316/434898. Спасибо. - person Ajay Sharma; 28.01.2014

Гораздо проще:

#define IS_IOS6_AND_UP ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
person Gowiem    schedule 13.02.2013
comment
Недостатком этого является то, что вы не можете использовать его вне блоков кода, например, в файлах заголовков и т. д. - person eremzeit; 10.09.2015

#ifdef __IPHONE_5_0 

и т.д

Просто найдите эту константу. Все целевые константы c начинаются с двух символов подчеркивания.

person Joel Teply    schedule 13.06.2012
comment
Это макрос препроцессора, то есть он выполняется во время компиляции приложения, а не на устройстве пользователя. Кроме того, правильный ответ уже был выбран почти год назад... - person kirb; 10.07.2012
comment
Этот макрос полезен для разделения кода во время компиляции с помощью #ifdef и #ifndef, все остальные ответы доступны только во время выполнения с использованием инструкции if. - person Itachi; 08.11.2018

Определите этот метод:

+(BOOL)iOS_5 {
    NSString *osVersion = @"5.0";
    NSString *currOsVersion = [[UIDevice currentDevice] systemVersion];
    return [currOsVersion compare:osVersion options:NSNumericSearch] == NSOrderedAscending;
}

Затем определите макрос как этот метод.

person James    schedule 20.10.2011
comment
NSOrderedAscending заставит этот метод вернуть false, если текущая ОС = 5.0. Вы должны использовать NSOrderedDescending - person matzahboy; 28.06.2012

Для проверки во время выполнения используйте что-то вроде этого:

- (BOOL)iOSVersionIsAtLeast:(NSString*)version {
    NSComparisonResult result = [[[UIDevice currentDevice] systemVersion] compare:version options:NSNumericSearch];
    return (result == NSOrderedDescending || result == NSOrderedSame);
}

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

@implementation UIDevice (OSVersion)
- (BOOL)iOSVersionIsAtLeast:(NSString*)version {
    NSComparisonResult result = [[self systemVersion] compare:version options:NSNumericSearch];
    return (result == NSOrderedDescending || result == NSOrderedSame);
}
@end

...

if([[UIDevice currentDevice] iOSVersionIsAtLeast:@"6.0"]) self.navigationBar.shadowImage = [UIImage new];
person dankrusi    schedule 25.09.2012