2009-06-22 16 views
8

Sto provando ad avere 2 versioni della mia applicazione iPhone all'interno dello stesso progetto XCode. Il codebase è quasi lo stesso e dove ho bisogno di avere comportamenti diversi ho deciso di usare i condizionali del preprocessore e il tag ${TARGET_NAME}.Come posso controllare TARGET_NAME della mia app per iPhone su XCode?

Ho impostato il OTHER_CFLAGS per contenere "-DTARGET_NAME=${TARGET_NAME}".

Poi nel mio codice ho cercato di fare

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

Purtroppo ottengo sempre "lite" stampato dal TARGET_NAME == myApp è sempre vero: dal TARGET_NAME è definito. Non posso per la vita di me capire come valutare questo paragone delle stringhe. Qualche idea?

grazie in anticipo

+0

non vuoi dire che ottieni sempre "pro" stampato poiché "TARGET_NAME == myApp' è sempre vero? – Marty

risposta

11

Non è possibile confrontare le stringhe del genere in un blocco #if. Invece, aggiungi le definizioni a ciascun target specifico. Ad esempio, sul target della versione completa, apri il pannello Informazioni e vai alla scheda build e aggiungi qualcosa come FULL_VERSION all'impostazione di build GCC_PREPROCESSOR_DEFINITIONS. Quindi, per il target lite, inserisci qualcosa come LITE_VERSION. Nel codice, si può fare:

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

Grazie, penso che farò in questo modo. All'inizio cercavo comunque questa soluzione, ma mi sono bloccato con il confronto dei blocchi #if da quando li ho trovati su alcuni blog (come "here": http: //www.pacificspirit.com/blog/2009/01/27/building_for_multiple_iphone_targets_in_xcode) ma sembra impossibile ... grazie ancora – onigiri

-1

per ottenere il vostro lavoro di valutazione condizionale, è necessario fare qualcosa di simile:

#define myApp  1 
#define myAppLite 2 

anticipo, come nel file _Prefix.pch.

1

realtà è possibile ottenere il nome del bersaglio per confrontare, ma questo non salterà codice non necessario da altri bersagli in fase di compilazione, per fare questo:

prima andare al menu del prodotto -> Scheme -> Modifica schema. .. (o CMD + <) Poi nella sezione argomenti, aggiungere le variabili di ambiente all'interno qualcosa di simile:

setup environment variables

nel codice è possibile ottenere il nome del bersaglio come:

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

È possibile confrontare quella stringa ora in fase di esecuzione.

Ma seguendo il tuo esempio: se vuoi che tutto il codice della versione Pro venga omesso al momento della compilazione. Dovresti fare ciò che dice @ jason-coco. E andare a macro del preprocessore in impostazioni di generazione, e aggiungere $(TARGET_NAME) lì:

enter image description here

il codice all'interno del #define verrà compilato ed eseguito se il mio obiettivo è "MLBGoldPA"

#if defined MLBGoldPA 
    NSLog(@"Compiling MLBGoldPA"); 
#endif 
Problemi correlati