2013-08-23 7 views
7

से सशर्त रूप से कोड छुपाएं तो यहां समस्या है। मैं जल्द ही आईओएस के लिए एक अद्यतन जारी करने के लिए तैयार हूं जो आईओएस 7 में कुछ समस्याओं का समाधान करेगा। ऐसा करने के लिए, मुझे कुछ विशिष्ट आईओएस 7 कार्यों/प्रकारों का उपयोग करने की आवश्यकता है। मैंने पूरी तरह से निश्चित किया है कि आईओएस 7 कोड केवल आईओएस 7 पर निष्पादित किया जाएगा और पूर्व आईओएस 7 के लिए अलग-अलग कोड पर फ़ॉलबैक होगा। बेशक, मुझे वर्तमान एक्सकोड बीटा के साथ सबमिट करने की अनुमति नहीं है, इसलिए मैं संकलन करने की कोशिश कर रहा हूं वर्तमान एक्सकोड रिलीज के साथ। हालांकि, मैं इस विशेष चेतावनी को निष्क्रिय करने के लिए एक रास्ता खोजने के लिए प्रतीत नहीं कर सकते हैं:कंपाइलर

Use of undeclared identifier '<Redacted>'.

किसी को भी एक #pragma का उपयोग कर इस चेतावनी को निष्क्रिय करने के लिए एक तरह से पता है। मैं

-w, -Weverthing, -Wall

लेकिन कुछ भी काम करने के लिए लगता है सहित विभिन्न लोगों के एक समूह की कोशिश की है।

अद्यतन उत्तर: आप निश्चित रूप से नहीं कर सकते हैं क्योंकि संकलक एक पहचानकर्ता संकलित नहीं कर सकता है, इसके बारे में कुछ भी नहीं जानता है। मेरे समाधान बस बनाने के लिए एक #define:

#define <redacted> 1

अद्यतन 2 वास्तव में यह बहुत आसान बना दिया नीचे इस सवाल का जवाब। मैंने पहले से ही #define Xcode5Code(code, alt) बनाया है जिसने मुझे कोड ब्लॉक को सशर्त रूप से निष्पादित करने की अनुमति दी है।

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 
    #define Xcode5Code(code, alt) code 
#else 
    #define Xcode5Code(code, alt) alt 
#endif 

यह मैं आसानी से उपयोग करके संकलक से कोड के ब्लॉक को छिपाने के लिए अनुमति देता है:: @maddy से समाधान का उपयोग कर इसे संशोधित करके

Xcode5Code({ 
    //Code to be execute only with Xcode 5 
}, { 
    //code to be executed in previous versions of Xcode 
}) 

#define Xcode5Code उपयोग का मुख्य लाभ यह है कि Xcode है यह आपके लिए स्वतः पूर्ण हो जाएगा, जो पूर्ण #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 का उपयोग करने से बहुत आसान है, जो एक्सकोड स्वतः पूर्ण नहीं होगा।

यह वास्तव में आईओएस 7 और पूर्व आईओएस 7 उपकरणों के बीच अंतर नहीं करेगा। यह केवल विशिष्ट एक्सकोड को संभालने वाले आईओएस के संस्करण को अलग करता है। आईओएस डिवाइस संस्करणों के बीच अंतर करने के लिए मैं उपयोग करता हूं:

NSUInteger DeviceSystemMajorVersion(void) { 
    static NSUInteger _deviceSystemMajorVersion = -1; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _deviceSystemMajorVersion = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] intValue]; 
    }); 
    return _deviceSystemMajorVersion; 
} 

उपरोक्त ऐप्पल का कोड है। एनडीए के चारों ओर नृत्य करने के लिए, मैं कहूंगा कि यह रूट नियंत्रक के दृष्टिकोण को बिछाने में मदद करता है, क्योंकि यह आपके द्वारा उपयोग किए जा रहे एक्सकोड के संस्करण और डिवाइस पर मौजूद आईओएस का संस्करण दोनों पर निर्भर करता है। और यदि आप बीटा के साथ-साथ उत्पादन कोड का प्रबंधन करने की कोशिश कर रहे हैं, तो इससे बहुत मदद मिल सकती है। एक बार जब आप एक्सकोड 5 के साथ ऐप्स जमा कर सकते हैं, तो #define Xcode5Code अब आवश्यक नहीं होगा।

+0

यह चेतावनी नहीं है, यह एक त्रुटि है। आप कैसे चाहते हैं कि कंपाइलर पहचानकर्ता को हेरफेर करे, जिसके बारे में पता नहीं है? – Mat

+0

क्या यह एक चेतावनी है? एक त्रुटि की तरह दिखता है। – trojanfoe

+0

@ मात आह ... ज़ाहिर है। जाहिर है मुझे आज और कॉफी चाहिए। हां, यह एक त्रुटि है और निश्चित रूप से मैं संकलक से कुछ ऐसा संकलित करने की उम्मीद नहीं कर सकता जिसके बारे में कुछ भी नहीं जानता है। –

उत्तर

22

आप Xcode के दो अंतर संस्करणों या दो अलग-अलग बेस एसडीके सेटिंग्स तो आप संकलक निर्देशों का उपयोग करना चाहिए के साथ अपने ऐप को संकलित करना चाहते हैं:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // iOS 7.0 supported 
    // iOS 7 code here 
#else 
    // Pre-iOS 7 code here 
#endif 

क्रम जांच के लिए इसका उपयोग न करें। यह समाधान केवल तभी उपयोग किया जाता है जब आपको दो अलग-अलग संस्करणों के साथ अपना कोड संकलित करना होगा। एक उदाहरण होगा कि आपने आईओएस 7 कोड जोड़ा होगा लेकिन आपको अभी भी कोड को एक्सकोड 4.6 के साथ संकलित करने की आवश्यकता है। संकलन निर्देशों का उपयोग करने से आप पुराने बेस एसडीके का उपयोग कर कंपाइलर से आईओएस 7 कोड को "छुपा" सकते हैं।

इस पर और उचित रनटाइम चेक के लिए दस्तावेज़ों में "एसडीके संगतता मार्गदर्शिका" देखें।

संबंधित मुद्दे