Verificar a versão do iOS em tempo de execução?

Esta é uma espécie de seguimento da minha última pergunta. Eu estou usando beginAnimations:context: para configurar um bloco de animação para animar alguns UITextLabels. No entanto, notei nos documentos que é dito: “O uso deste método é desencorajado no iOS 4.0 e posterior. Você deve usar os methods de animação baseados em blocos.”

Minha pergunta é que eu adoraria usar animateWithDuration: animations: (disponível no iOS 4.0 e posterior), mas não quero excluir pessoas usando o iOS 3.0. Existe uma maneira de verificar a versão iOS de um dispositivo em tempo de execução para que eu possa tomar uma decisão sobre qual instrução usar?

Em muitos casos, você não precisa verificar a versão do iOS diretamente, em vez de verificar se determinado método está presente no tempo de execução ou não.

No seu caso, você pode fazer o seguinte:

 if ([[UIView class] respondsToSelector:@selector(animateWithDuration:animations:)]){ // animate using blocks } else { // animate the "old way" } 

Solução mais simples para quem precisa de ajuda no futuro:

 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 } 

para estar em conformidade com a versão especificada no sistema define

// # 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
Você pode escrever uma function como essa (você provavelmente deveria armazenar essa versão em algum lugar, em vez de calculá-la toda vez):

 + (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; } 

Então você pode usar isso da seguinte maneira:

 if([Toolbox getSystemVersionAsAnInteger] >= __IPHONE_4_0) { //blocks } else { //oldstyle } 

Desencorajado não é o mesmo que depreciado.

Se você precisar dar suporte a versões anteriores do iOS que não possuem methods baseados em blocos, não há nada de errado em usar os methods mais antigos (desde que eles não tenham sido removidos, é claro).

Você pode usar a versão da estrutura Foundation para determinar a versão atual do sistema.

 if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){ //for earlier versions } else { //for iOS 7 } 

A maioria dessas soluções aqui é tão exagerada. Tudo o que você precisa fazer é [[UIDevice currentDevice].systemVersion intValue] . Isso remove automaticamente o decimal, portanto, não há necessidade de dividir a string.

Então você pode apenas checar como:

 if ([[UIDevice currentDevice].systemVersion intValue] >= 8) { // iOS 8.0 and above } else { // Anything less than iOS 8.0 } 

Você também pode definir uma macro com este código:

 #define IOS_VERSION [[UIDevice currentDevice].systemVersion intValue]; 

ou até mesmo include seu cheque:

 #define IOS_8PLUS ([[UIDevice currentDevice].systemVersion intValue] >= 8) 

Então você só precisa fazer:

 if (IOS_8PLUS) { // iOS 8.0 and above } else { // Anything less than iOS 8.0 } 

Para os meus propósitos, escrevi uma pequena biblioteca que abstrai as chamadas C subjacentes e apresenta uma interface Objective-C.

 GBDeviceDetails deviceDetails = [GBDeviceInfo deviceDetails]; if (deviceDetails.iOSVersion >= 6) { NSLog(@"It's running at least iOS 6"); //It's running at least iOS 6 } 

Além de obter a versão atual do iOS, ele também detecta o hardware do dispositivo subjacente e obtém informações sobre o tamanho da canvas; tudo em tempo de execução.

Está no github: GBDeviceInfo . Licenciado sob o Apache 2.

O XCode 7 adicionou a syntax available tornando isso relativamente mais simples:

Rápido:

 if #available(iOS 9, *) { // iOS 9 only code } else { // Fallback on earlier versions } 

O XCode 9 também adicionou essa syntax ao Objective-C

Objetivo-C:

 if (@available(iOS 9.0, *)) { // iOS 9 only code } else { // Fallback on earlier versions } 

Coloque isso no seu arquivo Prefix.pch

 #define IOS_VERSION [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] firstObject] intValue] 

E então você pode verificar versões do iOS como:

 if(IOS_VERSION == 8) { // Hello 8! } else { // Hello some other version! } 

Claro, se você pode usar a detecção de resources (e faz sentido para o seu caso de uso), você deve fazer isso.

No MonoTouch:

Para obter a versão principal, use:

 UIDevice.CurrentDevice.SystemVersion.Split('.')[0] 

Para uso de versão secundária:

 UIDevice.CurrentDevice.SystemVersion.Split('.')[1] 

Uma adaptação melhor e mais eficiente às soluções acima:

 -(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; } 

agora você pode

 if ([self getOsVersion].x < 7) { } 

HTH