2009-06-22 7 views
8

मैं एक ही एक्सकोड परियोजना के भीतर अपने आईफोन एप्लिकेशन के 2 संस्करण रखने की कोशिश कर रहा हूं। कोडबेस यह लगभग समान है और जहां मुझे अलग-अलग व्यवहार करने की आवश्यकता है, मैंने प्रीप्रोसेसर की सशर्तताओं और ${TARGET_NAME} टैग का उपयोग करने का निर्णय लिया है।मैं एक्सकोड पर अपने आईफोन ऐप के TARGET_NAME को कैसे देखूं?

मैंने OTHER_CFLAGS को "-DTARGET_NAME=${TARGET_NAME}" रखने के लिए सेट किया है। TARGET_NAME के बाद से परिभाषित किया गया है:

तब मेरे कोड में मैं

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

करने के लिए दुर्भाग्य से मैं हमेशा "लाइट" TARGET_NAME == myApp के बाद से बाहर मुद्रित यह हमेशा सच है की कोशिश की। मैं अपने जीवन के लिए यह नहीं समझ सकता कि इस स्ट्रिंग तुलना का मूल्यांकन कैसे किया जाए। कोई विचार? अग्रिम

+0

क्या आपका मतलब यह नहीं है कि आप हमेशा "प्रो" मुद्रित हो जाते हैं क्योंकि 'TARGET_NAME == myApp' हमेशा सत्य है? – Marty

उत्तर

11

में

धन्यवाद आप एक #if ब्लॉक में इस तरह तार तुलना नहीं कर सकते। इसके बजाय, प्रत्येक विशिष्ट लक्ष्य को परिभाषित करें। उदाहरण के लिए, पूर्ण संस्करण के लक्ष्य पर, जानकारी पैनल खोलें और बिल्ड टैब पर जाएं और FULL_VERSION जैसे GCC_PREPROCESSOR_DEFINITIONS बिल्ड सेटिंग में जोड़ें। फिर, लाइट लक्ष्य के लिए, LITE_VERSION जैसे कुछ दर्ज करें। अपने कोड में, आप कर सकते हैं: अपने _Prefix.pch फ़ाइल में

#define myApp  1 
#define myAppLite 2 

पहले से है, जैसे:

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

धन्यवाद, मुझे लगता है कि मैं इस तरह से करूँगा। शुरुआत में मैं इस समाधान के लिए वैसे भी जा रहा था, लेकिन मैं #if ब्लॉक तुलना के साथ फंस गया क्योंकि मुझे उन कुछ ब्लॉगों (जैसे "यहां": http: //www.pacificspirit पर मिला है।कॉम/ब्लॉग/200 9/01/27/building_for_multiple_iphone_targets_in_xcode) लेकिन ऐसा लगता है कि यह असंभव है ... धन्यवाद – onigiri

-1

अपने सशर्त मूल्यांकन काम कर पाने के लिए, आप की तरह कुछ करना है।

1

वास्तव में आप लक्ष्य के नाम यह तुलना करने के लिए प्राप्त कर सकते हैं, लेकिन इस संकलन समय पर अन्य लक्ष्यों से अनावश्यक कोड को छोड़ नहीं होगा, यह करने के लिए:

पहले मेनू उत्पाद के लिए जाने -> योजना -> संपादित योजना। .. (या CMD + <) तब तर्क अनुभाग में, अंदर वातावरण चर कुछ की तरह जोड़ें:

:

setup environment variables

अपने कोड में आप के रूप में लक्ष्य के नाम प्राप्त कर सकते हैं

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

अब आप उस स्ट्रिंग को रनटाइम में तुलना कर सकते हैं।

लेकिन आपके उदाहरण के बाद: यदि आप चाहते हैं कि सभी प्रो संस्करण कोड संकलन समय पर छोड़े जाए। आपको जो करना चाहिए वह @ जेसन-कोको कहता है। और निर्माण सेटिंग्स में पूर्वप्रक्रमक मैक्रो पर जाएँ, और जोड़ने $(TARGET_NAME) वहाँ:

enter image description here

#define अंदर कोड संकलित और निष्पादित किया जाएगा कि मेरे लक्षित "MLBGoldPA"

#if defined MLBGoldPA 
    NSLog(@"Compiling MLBGoldPA"); 
#endif 
है
संबंधित मुद्दे