2009-06-22 6 views
8

J'essaie d'avoir 2 versions de mon application iPhone dans le même projet XCode. La base de code est presque la même et où j'ai besoin d'avoir des comportements différents, j'ai décidé d'utiliser les conditions du préprocesseur et la balise ${TARGET_NAME}. J'ai défini le OTHER_CFLAGS pour qu'il contienne "-DTARGET_NAME=${TARGET_NAME}".Comment puis-je vérifier le TARGET_NAME de mon application iPhone sur XCode?

Puis dans mon code, j'ai essayé de le faire

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

Malheureusement, je reçois toujours « lite » imprimé depuis TARGET_NAME == myApp il est toujours vrai: depuis TARGET_NAME est défini. Je ne peux pas pour la vie de moi comprendre comment évaluer cette comparaison de chaîne. Une idée?

merci à l'avance

+0

ne voulez-vous pas que vous obtenez toujours "pro" imprimé depuis 'TARGET_NAME == myApp' est toujours vrai? – Marty

Répondre

11

Vous ne pouvez pas comparer les chaînes comme ça dans un bloc #if. Au lieu de cela, ajoutez les définitions à chaque cible spécifique. Par exemple, sur la cible de la version complète, ouvrez le panneau Informations et accédez à l'onglet Générer et ajoutez quelque chose comme FULL_VERSION au paramètre de construction GCC_PREPROCESSOR_DEFINITIONS. Ensuite, pour la cible légère, entrez quelque chose comme LITE_VERSION. Dans votre code, vous pouvez faire:

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

Merci, je pense que je ferai de cette façon. Au début, j'allais de toute façon pour cette solution, mais je suis resté bloqué avec la comparaison de blocs #if depuis que je les ai trouvés sur certains blogs (comme "ici": http: //www.pacificspirit.com/blog/2009/01/27/building_for_multiple_iphone_targets_in_xcode) mais il semble que ce soit impossible ... merci encore – onigiri

-1

pour obtenir votre travail d'évaluation conditionnelle, vous devez faire quelque chose comme:

#define myApp  1 
#define myAppLite 2 

au préalable, comme dans votre fichier _Prefix.pch.

1

vous pouvez réellement obtenir le nom de la cible pour le comparer, mais cela ne sera pas ignorer le code inutile d'autres cibles au moment de la compilation, pour ce faire:

d'abord aller au menu produit -> Système -> Modifier le schéma. .. (ou CMD + <) Ensuite, dans la section arguments, ajouter à l'intérieur des variables d'environnement quelque chose comme:

setup environment variables

dans votre code, vous pouvez obtenir le nom de la cible:

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

Vous pouvez comparer cette chaîne maintenant en cours d'exécution.

Mais en suivant votre exemple: si vous voulez que tout le code de la version Pro soit omis lors de la compilation. Vous devriez faire ce que dit @ jason-coco. Et aller à macros préprocesseur dans les paramètres de construction, et ajoutez $(TARGET_NAME) là:

enter image description here

Le code intérieur du #define sera compilé et exécuté si mon objectif est "MLBGoldPA"

#if defined MLBGoldPA 
    NSLog(@"Compiling MLBGoldPA"); 
#endif 
Questions connexes