2009-06-22 8 views
8

Próbuję mieć 2 wersję aplikacji mojego iPhone'a w ramach tego samego projektu XCode. Baza kodu jest prawie taka sama i tam, gdzie potrzebuję różnych zachowań. Zdecydowałem się użyć warunkowych preprocesorów i znacznika ${TARGET_NAME}.Jak mogę sprawdzić TARGET_NAME w mojej aplikacji na iPhone'a na XCode?

Ustawiłem OTHER_CFLAGS na "-DTARGET_NAME=${TARGET_NAME}".

Następnie w kodzie próbowałem zrobić

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

Niestety zawsze „lite” drukowany od TARGET_NAME == myApp to zawsze prawdziwe: od TARGET_NAME jest zdefiniowana. Nie mogę do końca życia dowiedzieć się, jak ocenić to porównanie ciągów. Każdy pomysł?

góry dzięki

+0

czy nie masz na myśli, że zawsze drukowane jest "pro", ponieważ "TARGET_NAME == myApp" jest zawsze prawdziwe? – Marty

Odpowiedz

11

Nie można porównywać ciągi takiego w bloku #if. Zamiast tego dodaj definicje do każdego określonego celu. Na przykład w celu pełnej wersji otwórz panel Informacje i przejdź do karty kompilacji i dodaj coś w stylu kompilacji do ustawienia kompilacji GCC_PREPROCESSOR_DEFINITIONS. Następnie dla lite targetu wpisz coś w rodzaju LITE_VERSION. W kodzie, można zrobić:

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

Dzięki, myślę, że zrobię w ten sposób. Na początku szukałem tego rozwiązania, ale utknąłem z porównaniem bloku #if, ponieważ znalazłem je na niektórych blogach (np. "Tutaj": http: //www.pacificspirit.com/blog/2009/01/27/building_for_multiple_iphone_targets_in_xcode) ale wydaje się, że to niemożliwe ... dzięki jeszcze raz – onigiri

-1

aby uzyskać warunkową oceny pracy, trzeba zrobić coś takiego:

#define myApp  1 
#define myAppLite 2 

wcześniej, jak w pliku _Prefix.pch.

1

Właściwie można uzyskać nazwa obiektu docelowego, aby je porównać, ale to nie pominie niepotrzebnego kodu z innymi celami w czasie kompilacji, aby to zrobić:

Najpierw przechodzimy do menu Product -> System -> Schemat Edit. .. (lub CMD + <) Następnie w sekcji argumentów dodać wewnątrz zmiennych środowiskowych coś takiego:

setup environment variables

w kodzie można uzyskać nazwę wybranego celu jak:

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

Możesz teraz porównać ten ciąg w środowisku wykonawczym.

Ale po twoim przykładzie: jeśli chcesz, aby cały kod wersji Pro został pominięty podczas kompilacji. Powinieneś robić to, co mówi @ jason-coco. I przejdź do makr preprocesora w ustawieniach budować i dodać $(TARGET_NAME) tam:

enter image description here

Kod wewnątrz #define będą sporządzane i realizowane, jeśli mój cel jest „MLBGoldPA”

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