2009-06-22 30 views
8

Tôi đang cố gắng có 2 phiên bản ứng dụng iPhone của mình trong cùng một dự án XCode. Các codebase nó gần như giống nhau và nơi tôi cần phải có hành vi khác nhau, tôi đã quyết định sử dụng điều kiện tiền xử lý và thẻ ${TARGET_NAME}.Làm cách nào để kiểm tra TARGET_NAME của ứng dụng iPhone trên XCode?

Tôi đã đặt OTHER_CFLAGS để chứa "-DTARGET_NAME=${TARGET_NAME}".

Sau đó trong mã của tôi, tôi đã cố gắng để làm

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

Đáng tiếc là tôi luôn nhận được "lite" in ra từ TARGET_NAME == myApp nó luôn luôn đúng: từ TARGET_NAME được định nghĩa. Tôi không thể cho cuộc sống của tôi tìm ra cách để đánh giá sự so sánh chuỗi này. Bất kỳ ý tưởng nào?

cảm ơn trước

+0

bạn không có nghĩa là bạn luôn được in "chuyên nghiệp" vì 'TARGET_NAME == myApp' luôn đúng không? – Marty

Trả lời

11

Bạn không thể so sánh các chuỗi như thế trong khối #if. Thay vào đó, hãy thêm các định nghĩa cho từng mục tiêu cụ thể. Ví dụ: trên mục tiêu của phiên bản đầy đủ, hãy mở bảng Thông tin và chuyển đến tab xây dựng và thêm một cái gì đó như FULL_VERSION vào cài đặt xây dựng GCC_PREPROCESSOR_DEFINITIONS. Sau đó, đối với mục tiêu lite, nhập một cái gì đó như LITE_VERSION. Trong mã của bạn, bạn có thể làm:

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

Cảm ơn, tôi nghĩ tôi sẽ làm theo cách này. Lúc đầu, tôi đã đi cho giải pháp này anyway, nhưng tôi đã bị mắc kẹt với sự so sánh khối #if kể từ khi tôi đã tìm thấy những người trên một số blog (như "ở đây": http: //www.pacificspirit.com/blog/2009/01/27/building_for_multiple_iphone_targets_in_xcode) nhưng có vẻ như không thể ... cảm ơn lần nữa – onigiri

-1

để làm việc đánh giá điều kiện của bạn, bạn phải làm một cái gì đó như:

#define myApp  1 
#define myAppLite 2 

trước, giống như trong file _Prefix.pch của bạn.

1

Trên thực tế bạn có thể có được tên của mục tiêu để so sánh nó, nhưng điều này sẽ không bỏ qua mã không cần thiết từ các mục tiêu khác tại thời gian biên dịch, để làm điều này:

Đầu tiên bạn vào menu sản phẩm -> Scheme -> Edit Scheme. .. (hoặc CMD + <) Sau đó, trong phần tranh luận, thêm bên trong biến môi trường gì đó như:

setup environment variables

trong mã của bạn, bạn có thể nhận được tên của mục tiêu như:

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

Bạn có thể so sánh chuỗi đó ngay bây giờ trong thời gian chạy.

Nhưng hãy làm theo ví dụ của bạn: nếu bạn muốn bỏ qua tất cả mã phiên bản Pro tại thời gian biên dịch. Bạn nên làm những gì @ jason-coco nói. Và đi đến macro Preprocessor trong xây dựng các thiết lập, và thêm $(TARGET_NAME) có:

enter image description here

Mã bên trong #define sẽ được biên dịch và thực thi nếu mục tiêu của tôi là "MLBGoldPA"

#if defined MLBGoldPA 
    NSLog(@"Compiling MLBGoldPA"); 
#endif 
Các vấn đề liên quan