Я хочу проверить, запускает ли пользователь приложение на iOS ниже 5.0, и отобразить метку в приложении.
Как программно определить, какая iOS работает на устройстве пользователя?
Спасибо!
Я хочу проверить, запускает ли пользователь приложение на iOS ниже 5.0, и отобразить метку в приложении.
Как программно определить, какая iOS работает на устройстве пользователя?
Спасибо!
Лучшая текущая версия, без необходимости иметь дело с числовым поиском в NSString, - это определить macros
(см. исходный ответ: Проверить Версия iOS для iPhone)
Эти макросы действительно существуют в github, см. https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h
Нравится:
#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)
и используйте их так:
if (SYSTEM_VERSION_LESS_THAN(@"5.0")) {
// code here
}
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
// code here
}
чтобы узнать версию ОС:
[[UIDevice currentDevice] systemVersion]
возвращает строку, которую можно превратить в int / float с помощью
-[NSString floatValue]
-[NSString intValue]
нравится
Оба значения (floatValue, intValue) будут удалены из-за своего типа, 5.0.1 станет 5.0 или 5 (float или int), для точного сравнения вам нужно будет разделить его на массив INT, который проверяет принятый ответ здесь: Проверить версию iPhone iOS
NSString *ver = [[UIDevice currentDevice] systemVersion];
int ver_int = [ver intValue];
float ver_float = [ver floatValue];
и сравните вот так
NSLog(@"System Version is %@",[[UIDevice currentDevice] systemVersion]);
NSString *ver = [[UIDevice currentDevice] systemVersion];
float ver_float = [ver floatValue];
if (ver_float < 5.0) return false;
Для синтаксиса Swift 4.0
В приведенном ниже примере просто проверяется, имеет ли устройство версию iOS11
или выше.
let systemVersion = UIDevice.current.systemVersion
if systemVersion.cgFloatValue >= 11.0 {
//"for ios 11"
}
else{
//"ios below 11")
}
systemVersion
устарел? Согласно документам Apple, он не устарел, так по какой-то другой причине?
- person Spencer Williams; 04.04.2013
Начиная с iOS 8, мы можем использовать новый метод isOperatingSystemAtLeastVersion
на NSProcessInfo
NSOperatingSystemVersion ios8_0_1 = (NSOperatingSystemVersion){8, 0, 1};
if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:ios8_0_1]) {
// iOS 8.0.1 and above logic
} else {
// iOS 8.0.0 and below logic
}
Помните, что это приведет к сбою в iOS 7, поскольку API не существовал до iOS 8. Если вы поддерживаете iOS 7 и ниже, вы можете безопасно выполнить проверку с помощью
if ([NSProcessInfo instancesRespondToSelector:@selector(isOperatingSystemAtLeastVersion:)]) {
// conditionally check for any version >= iOS 8 using 'isOperatingSystemAtLeastVersion'
} else {
// we're on iOS 7 or below
}
Для полноты картины, вот альтернативный подход, предложенный самой Apple в Руководство по переходу на пользовательский интерфейс iOS 7, которое включает проверку версии Foundation Framework.
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
// Load resources for iOS 6.1 or earlier
} else {
// Load resources for iOS 7 or later
}
isOperatingSystemAtLeastVersion
вызовет нераспознанный селектор, отправленный в исключение экземпляра в iOS 7 и ниже.
- person edc1591; 24.09.2014
Я знаю, что слишком поздно отвечать на этот вопрос. Я не уверен, работает ли мой метод на младших версиях iOS (‹5.0):
NSString *platform = [UIDevice currentDevice].model;
NSLog(@"[UIDevice currentDevice].model: %@",platform);
NSLog(@"[UIDevice currentDevice].description: %@",[UIDevice currentDevice].description);
NSLog(@"[UIDevice currentDevice].localizedModel: %@",[UIDevice currentDevice].localizedModel);
NSLog(@"[UIDevice currentDevice].name: %@",[UIDevice currentDevice].name);
NSLog(@"[UIDevice currentDevice].systemVersion: %@",[UIDevice currentDevice].systemVersion);
NSLog(@"[UIDevice currentDevice].systemName: %@",[UIDevice currentDevice].systemName);
Вы можете получить следующие результаты:
[UIDevice currentDevice].model: iPhone
[UIDevice currentDevice].description: <UIDevice: 0x1cd75c70>
[UIDevice currentDevice].localizedModel: iPhone
[UIDevice currentDevice].name: Someones-iPhone002
[UIDevice currentDevice].systemVersion: 6.1.3
[UIDevice currentDevice].systemName: iPhone OS
[[UIDevice currentDevice] systemVersion];
или проверьте версию, например
Вы можете получить указанные ниже макросы здесь.
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(IOS_VERSION_3_2_0))
{
UIImageView *background = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cs_lines_back.png"]] autorelease];
theTableView.backgroundView = background;
}
Надеюсь это поможет
Марек Себера большую часть времени великолепен, но если вы похожи на меня и обнаружите, что вам нужно часто проверять версию iOS, вы не хотите постоянно запускать макрос в памяти, потому что вы испытаете очень небольшое замедление, особенно на старых устройствах.
Вместо этого вы хотите один раз вычислить версию iOS как float и где-нибудь сохранить. В моем случае у меня есть GlobalVariables
одноэлементный класс, который я использую для проверки версии iOS в моем коде, используя такой код:
if ([GlobalVariables sharedVariables].iOSVersion >= 6.0f) {
// do something if iOS is 6.0 or greater
}
Чтобы включить эту функцию в своем приложении, используйте этот код (для iOS 5+ с использованием ARC):
GlobalVariables.h:
@interface GlobalVariables : NSObject
@property (nonatomic) CGFloat iOSVersion;
+ (GlobalVariables *)sharedVariables;
@end
GlobalVariables.m:
@implementation GlobalVariables
@synthesize iOSVersion;
+ (GlobalVariables *)sharedVariables {
// set up the global variables as a static object
static GlobalVariables *globalVariables = nil;
// check if global variables exist
if (globalVariables == nil) {
// if no, create the global variables class
globalVariables = [[GlobalVariables alloc] init];
// get system version
NSString *systemVersion = [[UIDevice currentDevice] systemVersion];
// separate system version by periods
NSArray *systemVersionComponents = [systemVersion componentsSeparatedByString:@"."];
// set ios version
globalVariables.iOSVersion = [[NSString stringWithFormat:@"%01d.%02d%02d", \
systemVersionComponents.count < 1 ? 0 : \
[[systemVersionComponents objectAtIndex:0] integerValue], \
systemVersionComponents.count < 2 ? 0 : \
[[systemVersionComponents objectAtIndex:1] integerValue], \
systemVersionComponents.count < 3 ? 0 : \
[[systemVersionComponents objectAtIndex:2] integerValue] \
] floatValue];
}
// return singleton instance
return globalVariables;
}
@end
Теперь вы можете легко проверить версию iOS без постоянного запуска макросов. В частности, обратите внимание на то, как я преобразовал [[UIDevice currentDevice] systemVersion]
NSString в CGFloat, который постоянно доступен без использования каких-либо неправильных методов, которые многие уже указали на этой странице. Мой подход предполагает, что строка версии имеет формат n.nn.nn (с учетом отсутствия последующих битов) и работает для iOS5 +. При тестировании этот подход работает намного быстрее, чем постоянный запуск макроса.
Надеюсь, это поможет любому, кто столкнулся с моей проблемой!
В MonoTouch:
Чтобы получить основную версию, используйте:
UIDevice.CurrentDevice.SystemVersion.Split('.')[0]
Для дополнительной версии используйте:
UIDevice.CurrentDevice.SystemVersion.Split('.')[1]
Чтобы получить более конкретную информацию о номере версии с разделением основной и дополнительной версии:
NSString* versionString = [UIDevice currentDevice].systemVersion;
NSArray* vN = [versionString componentsSeparatedByString:@"."];
Массив vN
будет содержать основную и вспомогательную версии в виде строк, но если вы хотите провести сравнение, номера версий следует хранить как числа (целые числа). Вы можете добавить этот код, чтобы сохранить их в C-массиве * versionNumbers
:
int versionNumbers[vN.count];
for (int i = 0; i < sizeof(versionNumbers)/sizeof(versionNumbers[0]); i++)
versionNumbers[i] = [[vN objectAtIndex:i] integerValue];
* C-массивы, используемые здесь для более краткого синтаксиса.
Простая проверка для iOS версии ниже 5 (все версии):
if([[[UIDevice currentDevice] systemVersion] integerValue] < 5){
// do something
};