Проверить версию iOS во время выполнения?
Это мой следующий вопрос. Я использую beginAnimations:context:
для установки блока анимации для анимации некоторых UITextLabels. Однако в документах я заметил: "Использование этого метода не рекомендуется в iOS 4.0 и более поздних версиях. Вместо этого вы должны использовать методы анимации на основе блоков".
Мой вопрос: я бы хотел использовать animateWithDuration: анимации: (доступно в iOS 4.0 и новее), но не хочу исключать людей с помощью iOS 3.0. Есть ли способ проверить версию iOS устройства во время выполнения, чтобы я мог принять решение о том, какой оператор использовать?
Ответы
Ответ 1
Во многих случаях вам не нужно напрямую проверять версию iOS, вместо этого вы можете проверить, присутствует ли конкретный метод во время выполнения или нет.
В вашем случае вы можете сделать следующее:
if ([[UIView class] respondsToSelector:@selector(animateWithDuration:animations:)]){
// animate using blocks
}
else {
// animate the "old way"
}
Ответ 2
Упрощенное решение для всех, кому понадобится помощь в будущем:
NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
if ( 5 == [[versionCompatibility objectAtIndex:0] intValue] ) { /// iOS5 is installed
// Put iOS-5 code here
} else { /// iOS4 is installed
// Put iOS-4 code here
}
Ответ 3
чтобы соответствовать версии, указанной в системе, определяет
//# define __IPHONE_2_0 20000
// # define __IPHONE_2_1 20100
// # define __IPHONE_2_2 20200
// # define __IPHONE_3_0 30000
// # define __IPHONE_3_1 30100
// # define __IPHONE_3_2 30200
// # define __IPHONE_4_0 40000
Вы можете написать такую функцию
(вы, вероятно, должны хранить эту версию где-то, а не вычислять ее каждый раз):
+ (NSInteger) getSystemVersionAsAnInteger{
int index = 0;
NSInteger version = 0;
NSArray* digits = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
NSEnumerator* enumer = [digits objectEnumerator];
NSString* number;
while (number = [enumer nextObject]) {
if (index>2) {
break;
}
NSInteger multipler = powf(100, 2-index);
version += [number intValue]*multipler;
index++;
}
return version;
}
Затем вы можете использовать его следующим образом:
if([Toolbox getSystemVersionAsAnInteger] >= __IPHONE_4_0)
{
//blocks
} else
{
//oldstyle
}
Ответ 4
Отклонено не то же самое, что и устаревшее.
Если вам нужно поддерживать более ранние версии iOS, которые не имеют основанных на блоке методов, нет ничего плохого в использовании старых методов (если они не были удалены, конечно).
Ответ 5
Вы можете использовать версию фреймворка Foundation для определения текущей версии системы.
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){
//for earlier versions
} else {
//for iOS 7
}
Ответ 6
Большинство из этих решений здесь настолько переполнены. Все, что вам нужно сделать, это [[UIDevice currentDevice].systemVersion intValue]
. Это автоматически удаляет десятичное число, поэтому нет необходимости разбивать строку.
Итак, вы можете просто проверить его как:
if ([[UIDevice currentDevice].systemVersion intValue] >= 8) {
// iOS 8.0 and above
} else {
// Anything less than iOS 8.0
}
Вы также можете определить макрос с помощью этого кода:
#define IOS_VERSION [[UIDevice currentDevice].systemVersion intValue];
или даже включить проверку:
#define IOS_8PLUS ([[UIDevice currentDevice].systemVersion intValue] >= 8)
Тогда вам просто нужно сделать:
if (IOS_8PLUS) {
// iOS 8.0 and above
} else {
// Anything less than iOS 8.0
}
Ответ 7
В моих целях я написал небольшую библиотеку, которая абстрагирует скрытые вызовы C и представляет интерфейс Objective-C.
GBDeviceDetails deviceDetails = [GBDeviceInfo deviceDetails];
if (deviceDetails.iOSVersion >= 6) {
NSLog(@"It running at least iOS 6"); //It running at least iOS 6
}
Помимо получения текущей версии iOS, она также обнаруживает аппаратное обеспечение базового устройства и получает информацию о размере экрана; все во время выполнения.
Это на github: GBDeviceInfo. Лицензия под Apache 2.
Ответ 8
Поместите это в файл Prefix.pch
#define IOS_VERSION [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] firstObject] intValue]
И тогда вы можете проверить версии iOS, например:
if(IOS_VERSION == 8)
{
// Hello 8!
}
else
{
// Hello some other version!
}
Отключить курс, если вы можете использовать обнаружение функции (и это имеет смысл для вашего случая использования), вы должны это сделать.
Ответ 9
XCode 7 добавил синтаксис available
, сделав это относительно простым:
Swift:
if #available(iOS 9, *) {
// iOS 9 only code
}
else {
// Fallback on earlier versions
}
XCode 9 также добавил этот синтаксис к Objective-C
Objective-C:
if (@available(iOS 9.0, *)) {
// iOS 9 only code
} else {
// Fallback on earlier versions
}
Ответ 10
В MonoTouch:
Чтобы использовать основную версию:
UIDevice.CurrentDevice.SystemVersion.Split('.')[0]
Для незначительной версии используйте:
UIDevice.CurrentDevice.SystemVersion.Split('.')[1]
Ответ 11
Немного лучше и эффективнее адаптироваться к вышеуказанным решениям:
-(CGPoint)getOsVersion
{
static CGPoint rc = {-1,-1};
if (rc.x == -1) {
NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
rc.x = [versionCompatibility[0] intValue];
rc.y = [versionCompatibility[1] intValue];
}
return rc;
}
теперь вы можете
if ([self getOsVersion].x < 7) {
}
НТН