¿Cómo puedo determinar mediante programación si mi aplicación se ejecuta en el simulador de iPhone?

votos
242

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 objetivo de mi pregunta es poder incluir / excluir código dinámicamente según la versión / simulador que se esté ejecutando, así que realmente estaría buscando algo así como una directiva de preprocesador que pueda proporcionarme esta información.

Publicado el 19/01/2009 a las 17:55
fuente por usuario
En otros idiomas...                            


22 respuestas

votos
333

Ya le preguntaron, pero con un título muy diferente.

Qué # definiciones están configuradas por Xcode al compilar para iPhone

Voy a repetir mi respuesta desde allí:

Está en los documentos del SDK en "Compilación de código fuente condicional"

La definición relevante es TARGET_OS_SIMULATOR, que se define en /usr/include/TargetConditionals.h en el marco de iOS. En las versiones anteriores de la cadena de herramientas, tenías que escribir:

#include "TargetConditionals.h"

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

#if TARGET_OS_SIMULATOR
    // Simulator-specific code
#else
    // Device-specific code
#endif

dependiendo de cuál es apropiado para su caso de uso.

Respondida el 19/01/2009 a las 18:17
fuente por usuario

votos
106

Código actualizado:

Se dice que esto funciona oficialmente.

#if TARGET_IPHONE_SIMULATOR
NSString *hello = @"Hello, iPhone simulator!";
#elif TARGET_OS_IPHONE
NSString *hello = @"Hello, device!";
#else
NSString *hello = @"Hello, unknown target!";
#endif

Publicación original (ya que está en desuso)

Este código te dirá si estás corriendo en un simulador.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif
Respondida el 19/01/2009 a las 18:10
fuente por usuario

votos
61

No Directiva pre-procesador, pero esto era lo que estaba buscando cuando vine a esta pregunta;

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
Respondida el 18/08/2010 a las 11:35
fuente por usuario

votos
54

La mejor manera de hacer esto es:

#if TARGET_IPHONE_SIMULATOR

y no

#ifdef TARGET_IPHONE_SIMULATOR

desde su siempre definido: 0 o 1

Respondida el 07/03/2011 a las 08:05
fuente por usuario

votos
26

En caso de Swift podemos implementar siguiente

Podemos crear estructura que le permite crear una estructura de datos

struct Platform {
    static let isSimulator: Bool = {
        #if arch(i386) || arch(x86_64)
            return true
        #endif
        return false
    }()
}

Entonces Si quisiéramos detectar si la aplicación se está construyendo para el dispositivo o simulador en Swift a continuación.

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}
Respondida el 25/02/2016 a las 01:48
fuente por usuario

votos
8

Todos aquellos respuesta son buenas, pero de alguna manera confunde novato como yo, ya que no aclara cheque de compilación y verificación de tiempo de ejecución. Preprocesador se compila antes de tiempo, pero hay que hacerlo más claro

Este artículo del blog muestra Cómo detectar el simulador de iPhone? claramente

Tiempo de ejecución

En primer lugar, vamos a discutir en breve. UIDevice que ofrece ya información sobre el dispositivo

[[UIDevice currentDevice] model]

le devolverá “simulador de iPhone” o “iPhone” de acuerdo a donde se está ejecutando la aplicación.

Tiempo de compilación

Sin embargo lo que desea es utilizar compilar define el tiempo. ¿Por qué? Debido a que compila su aplicación estrictamente para ser ejecutado ya sea dentro del simulador o en el dispositivo. Apple hace un llamado definen TARGET_IPHONE_SIMULATOR. Así que vamos a ver el código:

#if TARGET_IPHONE_SIMULATOR

NSLog(@"Running in Simulator - no app store or giro");

#endif
Respondida el 17/06/2014 a las 03:57
fuente por usuario

votos
7

Hay una manera mejor ahora!

A partir de Xcode 9.3 beta 4 se puede utilizar #if targetEnvironment(simulator)para comprobar.

#if targetEnvironment(simulator)
//Your simulator code
#endif
Respondida el 12/03/2018 a las 10:50
fuente por usuario

votos
6

En rápida:

#if (arch(i386) || arch(x86_64))
...            
#endif

De Detectar si la aplicación se está construyendo para el dispositivo o simulador en Swift

Respondida el 16/06/2016 a las 11:10
fuente por usuario

votos
6

Las respuestas anteriores son un poco anticuadas. He descubierto que todo lo que tiene que hacer es consultar la TARGET_IPHONE_SIMULATORmacro ( sin necesidad de incluir cualquier otro archivo de cabecera [suponiendo que está codificando para iOS]).

Intenté TARGET_OS_IPHONEpero regresó el mismo valor (1) cuando se ejecuta en un dispositivo real y el simulador, es por eso que recomiendo usar TARGET_IPHONE_SIMULATORen su lugar.

Respondida el 21/05/2013 a las 08:10
fuente por usuario

votos
4

Tenía el mismo problema, ambos TARGET_IPHONE_SIMULATORy TARGET_OS_IPHONEsiempre están definidos, y están configurados en 1. La solución de Pete funciona, por supuesto, pero si alguna vez construyes algo diferente a 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):

#if defined __arm__ || defined __thumb__
#undef TARGET_IPHONE_SIMULATOR
#define TARGET_OS_IPHONE
#else
#define TARGET_IPHONE_SIMULATOR 1
#undef TARGET_OS_IPHONE
#endif

Ponlo en un lugar conveniente, y luego finge que las TARGET_*constantes fueron definidas correctamente.

Respondida el 16/06/2009 a las 18:48
fuente por usuario

votos
2

Para Swift 4.2 / xCode 10

He creado una extensión en UIDevice, por lo que puedo pedir fácilmente porque si el simulador está en marcha.

// UIDevice+CheckSimulator.swift

import UIKit

extension UIDevice {

    /// Checks if the current device that runs the app is xCode's simulator
    static func isSimulator() -> Bool {        
        #if targetEnvironment(simulator)
            return true
        #else
            return false
        #endif
    }
}

En mi AppDelegate por ejemplo, utilizo este método para decidir wether de registrarse para la notificación a distancia es necesario, lo que no es posible para el simulador.

// CHECK FOR REAL DEVICE / OR SIMULATOR
if UIDevice.isSimulator() == false {

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}
Respondida el 25/11/2018 a las 13:29
fuente por usuario

votos
1

Que funciona para Swift 4yXcode 9.4.1

Utilizar este código:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif
Respondida el 18/07/2018 a las 19:06
fuente por usuario

votos
1

Con Swift 4.2 (Xcode 10), podemos hacer esto

#if hasTargetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif
Respondida el 11/06/2018 a las 08:33
fuente por usuario

votos
1

Alguien ha considerado la respuesta proporcionada aquí ?

Supongo que el objetivo-c equivalente sería

+ (BOOL)isSimulator {
    NSOperatingSystemVersion ios9 = {9, 0, 0};
    NSProcessInfo *processInfo = [NSProcessInfo processInfo];
    if ([processInfo isOperatingSystemAtLeastVersion:ios9]) {
        NSDictionary<NSString *, NSString *> *environment = [processInfo environment];
        NSString *simulator = [environment objectForKey:@"SIMULATOR_DEVICE_NAME"];
        return simulator != nil;
    } else {
        UIDevice *currentDevice = [UIDevice currentDevice];
        return ([currentDevice.model rangeOfString:@"Simulator"].location != NSNotFound);
    }
}
Respondida el 26/07/2017 a las 10:59
fuente por usuario

votos
1

Para incluir todos los tipos de "simuladores"

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
Respondida el 12/06/2015 a las 18:51
fuente por usuario

votos
0

Si nada funcionó, intente esto

public struct Platform {

    public static var isSimulator: Bool {
        return TARGET_OS_SIMULATOR != 0 // Use this line in Xcode 7 or newer
    }

}
Respondida el 17/09/2018 a las 13:33
fuente por usuario

votos
0

Apple ha añadido soporte para el control de la aplicación está prevista para el simulador con lo siguiente:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
Respondida el 11/07/2018 a las 22:43
fuente por usuario

votos
0

SWIFT 4 Solución

static let isSimulator: Bool = {
    return TARGET_OS_SIMULATOR == 1
}()

TARGET_OS_SIMULATORse encuentra en Darwin.TargetConditionals.swiftel archivo.

Respondida el 11/04/2018 a las 04:09
fuente por usuario

votos
0

/// Devuelve cierto si su simulador y no un dispositivo

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}
Respondida el 28/02/2018 a las 10:39
fuente por usuario

votos
0

Mi respuesta se basa en @ Daniel Magnusson respuesta y los comentarios de @Nuthatch y @ n.Drake. y escribo para ahorrar algo de tiempo para los usuarios que trabajan en veloces iOS9 y en adelante.

Esto es lo que funcionó para mí:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
Respondida el 23/12/2015 a las 09:30
fuente por usuario

votos
-3

Esto funcionó mejor para mí

NSString *name = [[UIDevice currentDevice] name];


if ([name isEqualToString:@"iPhone Simulator"]) {

}
Respondida el 11/05/2016 a las 03:40
fuente por usuario

votos
-3

En mi opinión, la respuesta (presentado arriba y repite a continuación):

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}

es la mejor respuesta, ya que, obviamente, se ejecuta en tiempo de ejecución frente a ser DIRECTIVA compilación.

Respondida el 09/09/2013 a las 15:45
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more