Como a pergunta indica, eu gostaria principalmente de saber se meu código está sendo executado no simulador, mas também estaria interessado em saber a versão específica do iphone que está sendo executada ou simulada.
EDIT: eu adicionei a palavra 'programaticamente' ao nome da pergunta. O objetivo da minha pergunta é ser capaz de incluir / excluir código dinamicamente, dependendo da versão / simulador em execução, então eu realmente procuraria algo como uma diretiva de pré-processador que possa me fornecer essas informações.
ios
objective-c
swift
xcode
ios-simulator
Jeffrey Meyer
fonte
fonte
Respostas:
Já perguntei, mas com um título muito diferente.
Quais #defines são configuradas pelo Xcode ao compilar para o iPhone
Vou repetir minha resposta a partir daí:
Está nos documentos do SDK em "Compilando código-fonte condicionalmente"
A definição relevante é TARGET_OS_SIMULATOR, definida em /usr/include/TargetConditionals.h na estrutura do iOS. Nas versões anteriores do conjunto de ferramentas, era necessário escrever:
mas isso não é mais necessário na cadeia de ferramentas atual (Xcode 6 / iOS8).
Então, por exemplo, se você quiser verificar se está executando no dispositivo, faça
dependendo do que for apropriado para o seu caso de uso.
fonte
Código atualizado:
Isto é suposto funcionar oficialmente.
Postagem original (desde que descontinuada)
Este código informa se você está executando em um simulador.
fonte
Não diretiva pré-processador, mas era isso que eu estava procurando quando cheguei a essa pergunta;
fonte
[model compare:iPhoneSimulator] == NSOrderedSame
deve ser escrito como[model isEqualToString:iPhoneSimulator]
[model hasSuffix:@"Simulator"]
se você se importa apenas com o "simulador" em geral, não com o iPhone ou o iPad em particular. Esta resposta não vai funcionar para simulador de iPad :)name
vez demodel
Simulator
palavra em seu nome do dispositivoA melhor maneira de fazer isso é:
e não
desde sempre definido: 0 ou 1
fonte
HÁ UMA MANEIRA MELHOR AGORA!
A partir do Xcode 9.3 beta 4, você pode usar
#if targetEnvironment(simulator)
para verificar.A ATUALIZAÇÃO
Xcode 10 e iOS 12 SDK também suporta isso.
fonte
No caso do Swift, podemos implementar os seguintes
Podemos criar struct que permite criar dados estruturados
Então, se quiséssemos detectar se o aplicativo está sendo criado para o dispositivo ou simulador no Swift, então.
fonte
#if #else #endif
que será melhor.Trabalhos para
Swift 5
eXcode 11.3.1
Use este código:
fonte
Todas essas respostas são boas, mas de alguma forma confunde o novato como eu, pois não esclarece a verificação de compilação e a verificação de tempo de execução. O pré-processador está antes do tempo de compilação, mas devemos deixar mais claro
Este artigo do blog mostra Como detectar o simulador do iPhone? claramente
Tempo de execução
Primeiro de tudo, vamos discutir em breve. O UIDevice já fornece informações sobre o dispositivo
retornará o "iPhone Simulator" ou "iPhone" de acordo com o local em que o aplicativo está sendo executado.
Tempo de compilação
No entanto, o que você deseja é usar o tempo de compilação definido. Por quê? Porque você compila seu aplicativo estritamente para ser executado dentro do Simulador ou no dispositivo. A Apple faz uma definição chamada
TARGET_IPHONE_SIMULATOR
. Então, vamos olhar o código:fonte
[[UIDevice currentDevice] model]
está retornando emiPhone
vez deiPhone Simulator
. Então, acho que essa não é a melhor abordagem.As respostas anteriores são um pouco datadas. Descobri que tudo que você precisa fazer é consultar a
TARGET_IPHONE_SIMULATOR
macro ( não é necessário incluir outros arquivos de cabeçalho [supondo que você esteja codificando para iOS]).Tentei,
TARGET_OS_IPHONE
mas ele retornou o mesmo valor (1) ao executar em um dispositivo e simulador reais, é por isso que recomendo o usoTARGET_IPHONE_SIMULATOR
.fonte
Em rápida:
Em Detectar se o aplicativo está sendo criado para dispositivo ou simulador no Swift
fonte
Eu tive o mesmo problema, ambos
TARGET_IPHONE_SIMULATOR
eTARGET_OS_IPHONE
sempre definidos, e definido como 1. A solução de Pete funciona, é claro, mas se você desenvolver algo que não seja intel (improvável, mas quem sabe), aqui está algo seguro como desde que o hardware do iphone não seja alterado (portanto, seu código funcionará sempre para os iphones atualmente disponíveis):Coloque isso em algum lugar conveniente e depois finja que as
TARGET_*
constantes foram definidas corretamente.fonte
Alguém considerou a resposta fornecida aqui ?
Suponho que o objetivo-c equivalente seria
fonte
Para Swift 4.2 / xCode 10
Criei uma extensão no UIDevice, para poder facilmente perguntar se o simulador está em execução.
No meu AppDelegate, por exemplo, uso esse método para decidir se é necessário o registro para notificação remota, o que não é possível para o simulador.
fonte
Para incluir todos os tipos de "simuladores"
fonte
-[NSString containsString]
?Com o Swift 4.2 (Xcode 10), podemos fazer isso
fonte
Minha resposta é baseada na resposta de Daniel Magnusson e nos comentários de @Nuthatch e @ n.Drake. e escrevo para economizar tempo para usuários rápidos que trabalham no iOS9 em diante.
Isto é o que funcionou para mim:
fonte
Simulator
palavra em seu nome do dispositivoUIDevice.current.name
relata o nome da máquina em que o Simulador está sendo executado (normalmente algo como "Simon's MacBook Pro" agora), para que o teste não seja confiável. Ainda estou procurando uma maneira limpa de corrigi-lo./// Retorna true se seu simulador e não um dispositivo
fonte
A Apple adicionou suporte para verificar se o aplicativo está direcionado para o simulador com o seguinte:
fonte
se nada funcionou, tente isso
fonte
Na minha opinião, a resposta (apresentada acima e repetida abaixo):
é a melhor resposta, pois é obviamente executada em RUNTIME, em vez de ser uma DIRETIVA COMPILE.
fonte
Isso funcionou para mim melhor
fonte
"iPhone"
.