2011-02-25 5 views
22

Cualquier código de ejemplo que me mostraría cómo, en mi iPhone código de aplicación:simulador de iPhone: cómo detectar cuándo se está ejecutando la aplicación en el simulador (para que pueda configurar los datos de prueba)?

  1. cómo detectar si la aplicación acaba de ser desplegado para ser ejecutado a un simulador (y no un dispositivo) [si "Desplegado "no está disponible, entonces solo detecta cuándo se está ejecutando la aplicación en el simulador en oposición a un dispositivo)
  2. ¿Dónde en el código de mi aplicación de iPhone pondría las líneas que configuran mis datos de prueba en el simulador? Esto es señalando que quería que los datos de la prueba se borraran/reinstalaran de manera efectiva cada vez que recompilara y empujara al simulador (sin embargo, no quería que este código se ejecutara durante el uso de la aplicación en el simulador, por ejemplo, capaz de intercambiar aplicaciones en el simulador & entonces cuando se inicia mi aplicación de nuevo en el simulador no debería ejecutar el código de configuración de datos

¿Alguna otra sugerencia mejores re cómo cubrir fuera de la gestión de estos datos de prueba en el simulador sería bueno. El trasfondo aquí es que estoy hablando de datos de prueba en el Calendario (por ejemplo, usando Event Kit), así que no quiero que la aplicación ponga elementos de calendario en mi iPhone cuando implemente en mi dispositivo (lo siento, solo tengo 1 personal iPhone aquí).

Respuesta

48

Yo, obviamente, usar algo como esto ...

#import <TargetConditionals.h> 

#if TARGET_IPHONE_SIMULATOR 

// Simulator specific code 

#else // TARGET_IPHONE_SIMULATOR 

// Device specific code 

#endif // TARGET_IPHONE_SIMULATOR 

Y a su segunda pregunta ... Algo como esto debería ayudarle. En su aplicación delegado:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    if (! [[NSUserDefaults standardUserDefaults] boolForKey:@"initialized"]) { 
    // Setup stuff 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"initialized"]; 
    } 

    ... your code ... 
} 
+0

gracias - así que re 2: en el código (es decir qué método) podría poner este código de configuración para que solo se ejecute cuando inicie la aplicación por primera vez? es decir, no se ejecutará nuevamente si salto a la aplicación B y luego regreso a mi aplicación. Sin embargo, supongo que cuando eliminé la aplicación (haciendo doble clic en el botón de iPhone, etc.), cuando volví a hacer clic en la aplicación, se clasificaría como ejecutarse por primera vez. Espero que esto tenga sentido. – Greg

+0

Acabo de editar mi respuesta. Necesita un indicador para saber si su aplicación se inicializó o no. Le mostré cómo hacer esto con los valores predeterminados del usuario, pero hay muchas formas de hacerlo. – robertvojta

+0

ok, gracias. ¿Quiere decir que no hay nada en el modelo de ciclo de vida de un iPhone (es decir, con estados, mensajes) que se diferencie intrínsecamente entonces? es decir, ¿tiene que codificarlo usted mismo? - También si lo hiciste (por ejemplo, en el simulador) borra la aplicación (es decir, cancelas el proceso, supongo), ¿funcionaría este código aquí? es decir, ¿realmente eliminaría NSUserDefaults? – Greg

12

Si desea comprobar en tiempo de ejecución (en vez tiempo de compilación con la macro # compilador) utilizar este código:

UIDevice *currentDevice = [UIDevice currentDevice]; 
if ([currentDevice.model rangeOfString:@"Simulator"].location == NSNotFound) { 
    //running on device 
} else { 
    // running in Simulator 
} 

ver también esta pregunta: How can I programmatically determine if my app is running in the iphone simulator?

+3

Esto ya no es correcto. currentDevice.model ahora devolverá "iPhone" o "iPad". Supongo que esto ha cambiado en las últimas actualizaciones de SDK. Usamos 'sysctlbyname (" hw.máquina ")' y comparar el valor de retorno a x86_64. – gilm

0

El bloque de código que funcionó para mí:

#if defined(__i386__) || defined(__x86_64__) 
    /* Run code if in Simulator */ 
#else 
    /* Run code if in device */ 
#end 

Noté que __i386__ no funciona para los simuladores de iPhone 6, así que agregué x86_64

+0

El uso de esta técnica es frágil porque requerirá actualización siempre que Apple actualice sus plataformas. La técnica especificada por robertvojta es más confiable. – ThomasW

+0

Eso es cierto. Pero es más fácil de usar, porque no necesita una importación. Además, no es tan común que Apple agregue una nueva plataforma. –

Cuestiones relacionadas