2009-06-22 9 views
8

Estoy tratando de tener 2 versiones de mi aplicación de iPhone dentro del mismo proyecto XCode. La base de código es casi la misma y donde necesito tener diferentes comportamientos. He decidido usar los condicionales del preprocesador y la etiqueta ${TARGET_NAME}.¿Cómo verifico el TARGET_NAME de mi aplicación de iPhone en XCode?

He configurado el OTHER_CFLAGS para que contenga "-DTARGET_NAME=${TARGET_NAME}".

Luego, en mi código que traté de hacer

#if TARGET_NAME == myApp 
    NSLog(@"pro"); 
#elif TARGET_NAME == myAppLite 
    NSLog(@"lite"); 
#endif 

Desafortunadamente Siempre tengo "light" impreso a cabo desde TARGET_NAME == myApp siempre es cierto: desde TARGET_NAME está definido. No puedo, por mi vida, descubrir cómo evaluar esta comparación de cuerdas. ¿Alguna idea?

gracias de antemano

+0

¿no quiere decir que siempre se imprime "pro" ya que 'TARGET_NAME == myApp' siempre es cierto? – Marty

Respuesta

11

no se puede comparar cadenas como que en un bloque #if. En su lugar, agregue las definiciones a cada objetivo específico. Por ejemplo, en el objetivo de la versión completa, abra el panel Información y vaya a la pestaña de compilación y agregue algo como FULL_VERSION a la configuración de compilación GCC_PREPROCESSOR_DEFINITIONS. Luego, para el objetivo lite, ingrese algo como LITE_VERSION. En su código, que puede hacer:

#ifdef FULL_VERSION 
NSLog(@"Full"); 
#else 
NSLog(@"Lite"); 
#endif 
+0

Gracias, creo que lo haré de esta manera. Al principio iba a buscar esta solución de todos modos, pero me quedé atrapado en la comparación del bloque #if ya que los encontré en algunos blogs (como "aquí": http: //www.pacificspirit.com/blog/2009/01/27/building_for_multiple_iphone_targets_in_xcode) pero parece imposible ... gracias de nuevo – onigiri

-1

para obtener su trabajo de evaluación condicional, se tienen que hacer algo como:

#define myApp  1 
#define myAppLite 2 

de antemano, al igual que en el archivo de _Prefix.pch.

1

En realidad se puede obtener el nombre del objetivo de comparar, pero esto no va a saltar el código innecesario de otras dianas en tiempo de compilación, para hacer esto:

Primero vaya al menú del producto -> Esquema -> Editar Esquema. .. (o CMD + <) Luego, en la sección de argumentos, añadir el interior de las variables de entorno algo como:

setup environment variables

en su código se puede obtener el nombre del destino como:

NSString *targetName = [[NSProcessInfo processInfo] environment][@"TARGET_NAME"]; 
NSLog(@"target = %@", targetName); // Will print the target's name 

Puede comparar esa cadena ahora en tiempo de ejecución.

Pero siguiendo su ejemplo: si desea que se omita todo el código de la versión Pro en tiempo de compilación. Deberías hacer lo que dice @ jason-coco. E ir a macros del preprocesador en configuración de generación, y añadir $(TARGET_NAME) allí:

enter image description here

El código dentro del #define serán compilados y ejecutados si mi objetivo es "MLBGoldPA"

#if defined MLBGoldPA 
    NSLog(@"Compiling MLBGoldPA"); 
#endif 
Cuestiones relacionadas