Como dice la pregunta, principalmente me gustaría saber si mi código se está ejecutando o no en el simulador, pero también estaría interesado en conocer la versión específica del iPhone que se está ejecutando o simulando.
EDITAR: agregué la palabra 'programáticamente' al nombre de la pregunta. El punto de mi pregunta es poder incluir / excluir dinámicamente el código dependiendo de la versión / simulador que se esté ejecutando, por lo que realmente estaría buscando algo como una directiva de preprocesador que pueda proporcionarme esta información.
ios
objective-c
swift
xcode
ios-simulator
Jeffrey Meyer
fuente
fuente
Respuestas:
Ya preguntado, pero con un título muy diferente.
¿Qué #defines configura Xcode al compilar para iPhone?
Repetiré mi respuesta desde allí:
Está en los documentos del SDK en "Compilación de código fuente condicionalmente"
La definición relevante es TARGET_OS_SIMULATOR, que se define en /usr/include/TargetConditionals.h dentro del marco de iOS. En versiones anteriores de la cadena de herramientas, tenía que escribir:
pero esto ya no es necesario en la cadena de herramientas actual (Xcode 6 / iOS8).
Entonces, por ejemplo, si desea verificar que se está ejecutando en el dispositivo, debe hacer
dependiendo de cuál sea apropiado para su caso de uso.
fuente
Código actualizado:
Se supone que esto funciona oficialmente.
Publicación original (desde obsoleto)
Este código le dirá si está ejecutando en un simulador.
fuente
No es una directiva previa al procesador, pero esto era lo que estaba buscando cuando llegué a esta pregunta;
fuente
[model compare:iPhoneSimulator] == NSOrderedSame
debe escribirse como[model isEqualToString:iPhoneSimulator]
[model hasSuffix:@"Simulator"]
si solo te importa el "simulador" en general, no el iPhone o iPad en particular. Esta respuesta no funcionará para el simulador de iPad :)name
lugar demodel
Simulator
palabras en el nombre de su dispositivoLa mejor manera de hacer esto es:
y no
ya que siempre está definido: 0 o 1
fuente
¡HAY UNA MEJOR MANERA AHORA!
A partir de Xcode 9.3 beta 4 puede usar
#if targetEnvironment(simulator)
para verificar.ACTUALIZAR
Xcode 10 y iOS 12 SDK también lo admiten.
fuente
En el caso de Swift podemos implementar los siguientes
Podemos crear una estructura que le permita crear datos estructurados
Entonces, si quisiéramos detectar si la aplicación se está construyendo para dispositivo o simulador en Swift, entonces.
fuente
#if #else #endif
que será mejor.Trabaja para
Swift 5
yXcode 11.3.1
Usa este código:
fuente
Todas esas respuestas son buenas, pero de alguna manera confunde a los novatos como yo, ya que no aclara la verificación de compilación y la verificación de tiempo de ejecución. El preprocesador es anterior al tiempo de compilación, pero debemos aclararlo
Este artículo de blog muestra ¿Cómo detectar el simulador de iPhone? claramente
Tiempo de ejecución
En primer lugar, discutamos brevemente. UIDevice le proporciona información sobre el dispositivo.
le devolverá "iPhone Simulator" o "iPhone" de acuerdo con el lugar donde se ejecuta la aplicación.
Tiempo de compilación
Sin embargo, lo que desea es utilizar el tiempo de compilación definido. ¿Por qué? Porque compila su aplicación estrictamente para que se ejecute dentro del Simulador o en el dispositivo. Apple hace un llamado definido
TARGET_IPHONE_SIMULATOR
. Así que echemos un vistazo al código:fuente
[[UIDevice currentDevice] model]
regresaiPhone
también en lugar deiPhone Simulator
. Entonces, creo que este no es el mejor enfoque.Las respuestas anteriores están un poco anticuadas. Descubrí que todo lo que necesita hacer es consultar la
TARGET_IPHONE_SIMULATOR
macro ( no es necesario incluir ningún otro archivo de encabezado [suponiendo que esté codificando para iOS]).Intenté
TARGET_OS_IPHONE
pero devolvió el mismo valor (1) cuando se ejecuta en un dispositivo y simulador real, por eso recomiendo usar en suTARGET_IPHONE_SIMULATOR
lugar.fuente
En rápido:
Desde Detectar si la aplicación se está creando para dispositivo o simulador en Swift
fuente
Tuve el mismo problema, ambos
TARGET_IPHONE_SIMULATOR
yTARGET_OS_IPHONE
siempre están definidos, y están configurados en 1. La solución de Pete funciona, por supuesto, pero si alguna vez se basa en algo que no sea Intel (poco probable, pero quién sabe), aquí hay algo que es seguro. siempre y cuando el hardware del iPhone no cambie (por lo que su código siempre funcionará para los iphones actualmente disponibles):Ponga eso en un lugar conveniente, y luego pretenda que las
TARGET_*
constantes se definieron correctamente.fuente
¿Alguien ha considerado la respuesta proporcionada aquí ?
Supongo que el objetivo-c equivalente sería
fuente
Para Swift 4.2 / xCode 10
Creé una extensión en UIDevice, por lo que puedo preguntar fácilmente si el simulador se está ejecutando.
En mi AppDelegate, por ejemplo, uso este método para decidir si es necesario registrarse para la notificación remota, lo que no es posible para el simulador.
fuente
Para incluir todos los tipos de "simuladores"
fuente
-[NSString containsString]
?Con Swift 4.2 (Xcode 10), podemos hacer esto
fuente
Mi respuesta se basa en la respuesta de @Daniel Magnusson y los comentarios de @Nuthatch y @ n.Drake. y lo escribo para ahorrar tiempo a los usuarios rápidos que trabajan en iOS9 y en adelante.
Esto es lo que funcionó para mí:
fuente
Simulator
palabras en el nombre de su dispositivoUIDevice.current.name
informa el nombre de la máquina en la que se está ejecutando el simulador (generalmente algo así como "MacBook Pro de Simon" ahora), por lo que la prueba se ha vuelto poco confiable. Todavía estoy buscando una forma limpia de solucionarlo./// Devuelve verdadero si es un simulador y no un dispositivo
fuente
Apple ha agregado soporte para verificar que la aplicación esté dirigida al simulador con lo siguiente:
fuente
si nada funcionó, intente esto
fuente
En mi opinión, la respuesta (presentada arriba y repetida abajo):
es la mejor respuesta porque obviamente se ejecuta en tiempo de ejecución en lugar de ser una DIRECTIVA DE COMPILACIÓN.
fuente
Esto funcionó para mí mejor
fuente
"iPhone"
.