A resposta rápida ...
A partir do Swift 2.0, você pode usar #available
um if
ou guard
para proteger código que só deve ser executado em determinados sistemas.
if #available(iOS 9, *) {}
No Objective-C, você precisa verificar a versão do sistema e realizar uma comparação.
[[NSProcessInfo processInfo] operatingSystemVersion]
no iOS 8 e superior.
A partir do Xcode 9:
if (@available(iOS 9, *)) {}
A resposta completa…
Em Objective-C e Swift, em casos raros, é melhor evitar confiar na versão do sistema operacional como uma indicação dos recursos do dispositivo ou do sistema operacional. Geralmente, existe um método mais confiável para verificar se um recurso ou classe específico está disponível.
Verificando a presença de APIs:
Por exemplo, você pode verificar se UIPopoverController
está disponível no dispositivo atual usando NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
Para classes fracamente vinculadas, é seguro enviar uma mensagem diretamente para a classe. Notavelmente, isso funciona para estruturas que não estão explicitamente vinculadas como "Necessárias". Para classes ausentes, a expressão é avaliada como nula, com falha na condição:
if ([LAContext class]) {
// Do something
}
Algumas classes, como CLLocationManager
e UIDevice
, fornecem métodos para verificar os recursos do dispositivo:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Verificando a presença de símbolos:
Muito ocasionalmente, você deve verificar a presença de uma constante. Isso surgiu no iOS 8 com a introdução de UIApplicationOpenSettingsURLString
, usado para carregar o aplicativo Configurações via -openURL:
. O valor não existia antes do iOS 8. A falta de nada para esta API trava, portanto, verifique primeiro a existência da constante:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Comparando com a versão do sistema operacional:
Vamos supor que você se depare com a necessidade relativamente rara de verificar a versão do sistema operacional. Para projetos direcionados ao iOS 8 e superior, NSProcessInfo
inclui um método para realizar comparações de versão com menos chance de erro:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Projetos voltados para sistemas mais antigos podem usar systemVersion
no UIDevice
. A Apple o usa em seu código de amostra GLSprite .
// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
displayLinkSupported = TRUE;
}
Se, por qualquer motivo, você decidir que systemVersion
é isso o que deseja, trate-o como uma sequência ou corre o risco de truncar o número de revisão do patch (por exemplo, 3.1.2 -> 3.1).