Quero verificar se a iOS
versão do dispositivo é maior do 3.1.3
que tentei coisas como:
[[UIDevice currentDevice].systemVersion floatValue]
mas não funciona, eu só quero um:
if (version > 3.1.3) { }
Como posso conseguir isso?
ios
objective-c
John
fonte
fonte
if #available(iOS 9, *) {}
no Swift. Iniciando o Xcode 9,if (@available(iOS 11, *)) {}
no objetivo-c.Respostas:
A resposta rápida ...
A partir do Swift 2.0, você pode usar
#available
umif
ouguard
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 usandoNSClassFromString
: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:
Algumas classes, como
CLLocationManager
eUIDevice
, fornecem métodos para verificar os recursos do dispositivo: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: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:Projetos voltados para sistemas mais antigos podem usar
systemVersion
noUIDevice
. A Apple o usa em seu código de amostra GLSprite .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).fonte
-viewWillAppear
aUISplitViewController
. Meu truque é determinar se o <iOS 4.0 e enviá-lo para o Controlador de exibição de detalhes nas exibições raiz-didSelectRowAtIndexPath
.[@"10.0" compare:@"10" options:NSNumericSearch]
retornosNSOrderedDescending
, que podem muito bem não ser planejados. (Eu poderia esperarNSOrderedSame
.) Essa é pelo menos uma possibilidade teórica.respondsToSelector
et al não fariam o trabalho - tem que comparar versões.NSFoundationVersionNumber
oe somente se isso não for possível, deve verificar as versões do sistemaUIDevice
.fonte
.0
números opcionais . Por exemplo,SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0.0")
fornece resultado incorreto no iOS 7.0.Conforme sugerido pelos documentos oficiais da Apple : você pode usar o
NSFoundationVersionNumber
, noNSObjCRuntime.h
arquivo de cabeçalho.fonte
NSFoundationVersionNumber_iOS_6_1
não existe no iOS 5 SDK.#ifndef NSFoundationVersionNumber_iOS_7_0 #define NSFoundationVersionNumber_iOS_7_0 1047.00 #endif
. Para evitar mexer dessa maneira, eu fui com a macro SYSTEM_VERSION_LESS_THAN (v) de yasirmturkNSFoundationVersionNumber_iOS_8_0
no iOS 9. apenas verificar se háNSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1
Iniciando o Xcode 9, no Objective-C :
Iniciando o Xcode 7, no Swift :
Para a versão, você pode especificar o MAJOR, o MINOR ou o PATCH (consulte http://semver.org/ para obter definições). Exemplos:
iOS 11
eiOS 11.0
são a mesma versão mínimaiOS 10
,iOS 10.3
,iOS 10.3.1
São diferentes versões mínimasVocê pode inserir valores para qualquer um desses sistemas:
iOS
,macOS
,watchOS
,tvOS
Exemplo de caso real retirado de um dos meus pods :
documentação
fonte
if (...) {} else { ... }
guard
no Objective-C em vez de deixar o bloco aberto e recuar naelse
instrução?if
bloco vazio seguido por umelse
.if
blocos vazios .Isso é usado para verificar a versão do SDK compatível no Xcode, isto é, se você tiver uma equipe grande com versões diferentes do Xcode ou vários projetos que suportam SDKs diferentes que compartilham o mesmo código:
O que você realmente deseja é verificar a versão do iOS no dispositivo. Você pode fazer isso com isso:
Versão Swift:
As versões atuais do swift devem usar isso:
fonte
Tentar:
fonte
Abordagem preferida
No Swift 2.0, a Apple adicionou a verificação de disponibilidade usando uma sintaxe muito mais conveniente (Leia mais aqui ). Agora você pode verificar a versão do sistema operacional com uma sintaxe mais limpa:
Este é o preferido sobre a verificação
respondsToSelector
etc ( O que há de novo no Swift ). Agora, o compilador sempre avisará se você não estiver protegendo seu código corretamente.Pre Swift 2.0
O novo no iOS 8 está
NSProcessInfo
permitindo melhores verificações de versão semântica.Implementando no iOS 8 e superior
Isso produziria o seguinte:
Implantando no iOS 7
Isso renderia:
Mais leitura em NSHipster .
fonte
Eu sempre mantenho aqueles no meu arquivo Constants.h:
fonte
.pch
arquivo de seu projeto XcodeConstants.h
arquivo que são importadas no meupch
arquivo.fonte
Com a classe Version contida no projeto nv-ios-version (Licença Apache, versão 2.0), é fácil obter e comparar a versão do iOS. Um código de exemplo abaixo despeja a versão do iOS e verifica se a versão é maior ou igual a 6.0.
Página do projeto: nv-ios-version
TakahikoKawasaki / nv-ios-version
Blog: Obtenha e compare a versão do iOS em tempo de
execução com a classe Version
fonte
Nova maneira de verificar a versão do sistema usando o rápido Forget [[UIDevice currentDevice] systemVersion] e NSFoundationVersionNumber.
Podemos usar NSProcessInfo -isOperatingSystemAtLeastVersion
fonte
UIDevice + IOSVersion.h
UIDevice + IOSVersion.m
fonte
Em geral, é melhor perguntar se um objeto pode executar um determinado seletor, em vez de verificar um número de versão para decidir se ele deve estar presente.
Quando isso não é uma opção, você precisa ter um pouco de cuidado aqui, porque
[@"5.0" compare:@"5" options:NSNumericSearch]
retornosNSOrderedDescending
que podem muito bem não ser pretendidos; Eu poderia esperarNSOrderedSame
aqui. Essa é pelo menos uma preocupação teórica, que vale a pena defender contra, na minha opinião.Também vale a pena considerar é a possibilidade de uma entrada de versão ruim, que não pode ser razoavelmente comparada. A Apple fornece as três constantes predefinidas
NSOrderedAscending
,NSOrderedSame
eNSOrderedDescending
mas eu posso pensar de um uso para alguma coisa chamadaNSOrderedUnordered
em caso eu não posso comparar duas coisas e eu quero retornar um valor indicando isso.Além disso, não é impossível que a Apple um dia expanda suas três constantes predefinidas para permitir uma variedade de valores de retorno, fazendo uma comparação
!= NSOrderedAscending
imprudente.Com isso dito, considere o seguinte código.
fonte
Onde é claro,
NSFoundationVersionNumber_iOS_6_1
deve ser alterado para aplicável à versão do iOS que você deseja verificar. O que eu escrevi agora provavelmente será muito usado ao testar se um dispositivo está executando o iOS7 ou uma versão anterior.fonte
um pouco atrasado para a festa, mas à luz do iOS 8.0 lá fora, isso pode ser relevante:
se você pode evitar o uso
[[UIDevice currentDevice] systemVersion]
Em vez disso, verifique a existência de um método / classe / qualquer outra coisa.
Achei que era útil para o gerenciador de localizações, em que preciso chamar requestWhenInUseAuthorization for iOS 8.0, mas o método não está disponível para iOS <8
fonte
fonte
Sei que essa é uma pergunta antiga, mas alguém deveria ter mencionado as macros em tempo de compilação
Availability.h
. Todos os outros métodos aqui são soluções de tempo de execução e não funcionarão em um arquivo de cabeçalho, categoria de classe ou definição de ivar.Para essas situações, use
h / t esta resposta
fonte
Em seguida, adicione uma condição if da seguinte maneira: -
fonte
Existem versões como 7.0 ou 6.0.3, para que possamos simplesmente converter a versão em números para comparar. se a versão for como 7.0, basta acrescentar outro ".0" a ela e, em seguida, levar seu valor numérico.
For 6.0.0
para 7.0
fonte
6.1.10
. então esse algoritmo produzirá6110 > 700
, o que não está correto.Experimente o código abaixo:
fonte
Apenas para recuperar o valor da string da versão do SO:
fonte
Como uma variação da solução yasimturks, defini uma função e alguns valores de enumeração em vez de cinco macros. Acho mais elegante, mas isso é uma questão de gosto.
Uso:
arquivo .h:
arquivo .m:
Você deve adicionar o prefixo do seu aplicativo aos nomes, especialmente ao
Comparison
tipo.fonte
Usando a maneira recomendada mencionada ... se não houver definição nos arquivos de cabeçalho, você poderá obter a versão imprimindo-a no console com um dispositivo da versão IOS desejada.
fonte
Solução para verificar a versão iOS no Swift
Con desta solução: é simplesmente uma má prática verificar os números de versão do sistema operacional, da maneira que você faz. Nunca se deve codificar as dependências dessa maneira, sempre verifique se há recursos, capacidades ou a existência de uma classe. Considere isto; A Apple pode lançar uma versão compatível com versões anteriores de uma classe, se o fizesse, o código sugerido nunca a usaria, pois sua lógica procura um número de versão do sistema operacional e NÃO a existência da classe.
( Fonte desta informação )
Solução para verificar a existência de classe no Swift
Não use
if (NSClassFromString("UIAlertController") == nil)
porque ele funciona corretamente no simulador do iOS usando o iOS 7.1 e 8.2, mas se você testar em um dispositivo real usando o iOS 7.1, infelizmente perceberá que nunca passará pela outra parte do snippet de código.fonte
fonte
Uma versão mais genérica no Obj-C ++ 11 (você provavelmente poderia substituir algumas dessas coisas pelas funções NSString / C, mas isso é menos detalhado. Isso oferece dois mecanismos. SplitSystemVersion fornece uma matriz de todas as partes úteis se você só deseja ativar a versão principal (por exemplo
switch([self splitSystemVersion][0]) {case 4: break; case 5: break; }
).fonte
Tente isto
fonte
fonte
float versionToBeCompared = 3.1.3;
não pode nem compilar.Exemplo rápido que realmente funciona:
Não use o NSProcessInfo porque ele não funciona com o 8.0, por isso é praticamente inútil até 2016
fonte
Aqui está uma versão rápida:
Uso:
fonte
struct iOSVersion { static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue static let iOS7 = (iOSVersion.SYS_VERSION_FLOAT < 8.0 && iOSVersion.SYS_VERSION_FLOAT >= 7.0) static let iOS8 = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0) static let iOS9 = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0) }