2012-07-27 18 views
12

के साथ पिछड़ा संगतता सुनिश्चित करना हमेशा जब ऐप्पल ओएस एक्स अपडेट करता है, तो नवीनतम एक्सकोड 4.4 पुराने (10.6) एसडीके को डंप करता है और मुझे खुद को 10.7 एसडीके (या 10.8 I) का उपयोग करने की आवश्यकता होती है। मान लीजिए) और संगतता बनाए रखने के लिए मेरे परिनियोजन लक्ष्य को 10.6 पर सेट करना।मैक एसडीके: नवीनतम एसडीके का उपयोग करके, पहले तैनाती लक्ष्य

मैं पुराने एसडीके से लिंक करना पसंद करता हूं क्योंकि मुझे पता है कि मैं गलती से नहीं कर सकता एपीआई को कॉल शुरू कर सकता हूं जो अभी तक मौजूद नहीं हैं। जब मैंने पिछली दृष्टिकोण की कोशिश की तो मैंने नियमित रूप से कुछ पाया।

मुझे अपने आप को क्या लगता है कि मैं एक्सकोड में कोड पूर्णता सुविधा का उपयोग एनएसवर्क्स स्पेस जैसे साधारण वर्ग के लिए "दाएं" कॉल चुनने के लिए करता हूं, फिर सब कुछ विकास के दौरान ठीक काम करता है, मैं इसके बारे में भूल जाता हूं और जब मैं एक नया रिलीज करता हूं संस्करण: कबाब! रन-टाइम पर पहले ओएस एक्स रिलीज पर पूरा एप्लिकेशन विस्फोट; अक्सर उन कठिन स्थानों तक :-)

या कम से कम यह मेरे लिए कुछ साल पहले की स्थिति थी।

निश्चित रूप से, अब वहाँ एक रास्ता है के द्वारा करने के लिए या तो:

  • सुनिश्चित करें कि आप API कॉल है कि भले ही हालांकि वे SDK में परिभाषित कर रहे हैं अपने तैनाती लक्ष्य में अभी उपलब्ध नहीं हैं परिचय नहीं है

  • निर्माण या स्थिर विश्लेषण समय के दौरान इस तरह के कॉल का पता लगाने

मुझे यकीन है कि मैं कुछ नहीं छूटा है, कहीं न कहीं रेखा के साथ .. कृपया मुझे प्रबुद्ध रहा हूँ!

सादर,

फ्रैंक

+0

मैं आईओएस के विषय में एक ऐसी ही सवाल था, लेकिन कई बिंदुओं समान होना चाहिए। http://stackoverflow.com/questions/19111934/get-xcode-5-to-warn-about-new-api-calls/19131877 – Rivera

उत्तर

6

निश्चित रूप से, अब तक वहाँ एक रास्ता है या तो करने के लिए:

  • सुनिश्चित करें कि आप API कॉल है कि भले ही हालांकि वे SDK में परिभाषित कर रहे हैं अपने तैनाती लक्ष्य में अभी तक उपलब्ध नहीं हैं परिचय नहीं है

  • निर्माण या स्थिर विश्लेषण समय के दौरान इस तरह के कॉल का पता लगाने

कोई नहीं है। हां, आपको इसके खिलाफ एक रडार (bugreport.apple.com) खोलना चाहिए। यदि आप चाहें, तो आप मेरा डुप्लिकेट कर सकते हैं: rdar://11985733

हाँ, एप्पल की सिफारिश के बावजूद एकमात्र व्यावहारिक समाधान पुराने एसडीके की प्रतिलिपि बनाना और उनके खिलाफ लिंक करना है।

मैंने डब्ल्यूडब्ल्यूडीसी 2012 में इस मुद्दे के बारे में एक्सकोड टीम के साथ बात करने में काफी समय बिताया। वे इस बात पर सहमत हुए कि यह टूट गया है। वर्तमान में इसे ठीक करने की कोई योजना नहीं है। बढ़ते रडार यह है कि हम इन चीजों पर ऐप्पल को कैसे प्रभावित करते हैं।

2

मैं आम तौर पर कर रहा हूँ नए एक तो यह है कि संकलक के पुराने संस्करणों से एसडीके कॉपी मुझे Blain अगर मैं समर्थित नहीं कुछ का उपयोग करेगा।

इसके अलावा, आप बस पर त्वरित सहायता देखो जब कुछ तरीकों कि आप सुनिश्चित नहीं हैं बुला सकते हैं, के बारे में की तरह स्क्रीनशॉट में आप देख सकते हैं कि launchApplicationAtURL विधि है 10.6

ही उपलब्ध से enter image description here

+0

क्षमा करें मैं जाहिर तौर पर बक्षीस को विभाजित नहीं कर सकता .. आपकी मदद के लिए धन्यवाद! –

2

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


तो यहाँ है कि मैं क्या iOS के लिए किया गया है:

मैं पहली बार बड़े सिम्युलेटर एसडीके मैं प्राप्त करना चाहता था पाने के लिए था। मैं इसे पुराने एक्सकोड (4 नहीं) संस्करणों को डाउनलोड करके आसानी से प्राप्त कर सकता था जिसमें एसडीके की आवश्यकता थी।

मुझे अगली बार एसडीके स्थापित करना पड़ा। यह बहुत कठिन नहीं था, इसलिए मैं यहां बहुत कुछ नहीं समझाऊंगा। लेकिन एसडीके Packages फ़ोल्डर में संग्रहीत हैं। यह फ़ोल्डर पहले एक्सकोड 3 संस्करणों में स्पष्ट रूप से दिखाई देता है लेकिन बाद के संस्करणों में छिपा हुआ है। टर्मिनल के माध्यम से आप इसे आसानी से खोल सकते हैं। इसके अलावा, एक्सकोड 4.3 में परिवर्तन के बाद जहां Developer फ़ोल्डर Xcode.app के भीतर स्थानांतरित हो गया, इसलिए मुझे एसडीके को एक टीएमपी फ़ोल्डर में स्थापित करना था और एसडीके को एक्सकोड.एप में ले जाना था। अगर मैं इसे खोलता तो मुझे एक्सकोड को फिर से शुरू करने की आवश्यकता होगी।

उसके बाद, मैंने आपके प्रोजेक्ट में debug कॉन्फ़िगरेशन को डुप्लिकेट किया और इसे मेरे नाम में, iOS 4.3 API Check या ऐसा कुछ भी - वास्तव में कोई फर्क नहीं पड़ता। तब मैंने इस नए कॉन्फ़िगरेशन के बेस एसडीके को पुराने एसडीके में बदल दिया जो मैंने स्थापित किया था। मैंने स्थापित एसडीके सूचीबद्ध नहीं किया था, इसलिए मुझे other का चयन करना पड़ा और फिर से मेरे मामले में iphonesimulator4.3 दर्ज करना पड़ा।

अंत में, जब मुझे एसडीके के पुराने संस्करणों के खिलाफ जांच करने की आवश्यकता होती है, तो मैंने अपनी परियोजना योजना में कॉन्फ़िगरेशन में Run <appname>.app के लिए कॉन्फ़िगरेशन बदल दिया। और वहां हम आईओएस 4.3 के खिलाफ संकलन-समय की जांच करते हैं।


मैक ओएस एक्स के लिए, मुझे यकीन है कि आप एक ही विधि के साथ एक ही लक्ष्य प्राप्त कर सकते हैं। मैक एसडीके के लिए सिमुलेटर नहीं हैं इसलिए मुझे लगता है कि नियमित एसडीके इसके लिए काम करेगा। पुराने एसडीके प्राप्त करने के लिए, यदि आपके पास Xcode 4.2 अभी भी स्थापित है (Xcode 4.3 के बाद इसे बदल दिया गया है तो Developer फ़ोल्डर Xcode.app के भीतर है) तो आपको वहां 10.6 एसडीके मिलना चाहिए। यदि आप नहीं करते हैं, तो मैं कल्पना करता हूं कि ऐप्पल के पास आईओएस की समान बात है जहां एसडीके डाउनलोड देव केंद्र में या इंटरनेट पर कहीं भी उपलब्ध हैं ...

बेस एसडीके सेट करने के लिए, यदि यह नहीं है सूचीबद्ध है तो मुझे लगता है कि नाम MacOSX10.6 है या जो भी संस्करण आप के बाद हैं।

बाकी सब कुछ समान होना चाहिए, लेकिन जैसा कि पहले उल्लेख किया गया है, मैं आज बाद इस विधि का परीक्षण करूंगा और एक और निश्चित उत्तर देने के लिए अपना उत्तर संपादित करूंगा लेकिन मुझे लगता है कि यह विधि मैक एसडीके के लिए काम करेगी।

+0

क्षमा करें मैं जाहिर तौर पर बक्षीस को विभाजित नहीं कर सकता .. आपकी मदद के लिए धन्यवाद! –

0

मैं संकलक/त्रुटियों के रूप में कमजोर-जुड़े प्रतीकों को ध्वजांकित करने के लिए संकलक प्राप्त करने के लिए उपलब्धता.h के आसपास हैकिंग करके अपना कोड जांचता हूं।मेरे वर्तमान (एक्सकोड 5/llvm) अवतार में, मैं नीचे दिए गए कोड का उपयोग कर रहा हूं। जब भी मैं आईओएस 6.0 या बाद में पेश किए गए प्रतीक का उपयोग करता हूं तो यह चेतावनी देता है। मुझे लगता है कि यह काफी आत्म-व्याख्यात्मक है। मैक्रोज़ को प्रत्येक एसडीके अपडेट पर अपडेट करने की आवश्यकता होती है, इसलिए ध्यान से चलें। ओह, और आप भी बहिष्करण चेतावनियों को खो देते हैं, इसलिए मैं अपने सशर्त कोड को दोबारा जांचने के लिए थोड़ी देर में इसका उपयोग करता हूं।

#undef __NSi_6_0 
#define __NSi_6_0 deprecated=1.0 
#undef __NSi_6_1 
#define __NSi_6_1 deprecated=1.0 
#undef __NSi_7_0 
#define __NSi_7_0 deprecated=1.0 

#undef __NSd_6_0 
#define __NSd_6_0 
#undef __NSd_6_1 
#define __NSd_6_1 
#undef __NSd_7_0 
#define __NSd_7_0 

मैं भी http://iphone.m20.nl/wp/2013/10/xcode-5-and-flagging-weak-linked-unavailable-symbols-from-a-newer-sdk/

+0

मैं वास्तव में पुराने एसडीके को एक्सकोड 5 में कॉपी करने के लिए सड़क पर गया हूं, जो 10.7 के लिए ठीक काम करता है। –

+0

मैंने तब से लिंक किए गए टूल की खोज की है: http://www.deploymateapp.com जो आपको पिछड़ा संगतता के लिए अपना कोड जांचने की अनुमति देता है। –

+0

एक पुराने एसडीके का उपयोग करना ठीक है। यदि आप नए ओएस से चुनिंदा सुविधाओं का उपयोग करना चाहते हैं तो मेरा दृष्टिकोण उपयोगी है। मुझे लगता है कि तैनाती कुछ समान करता है। –

0

भी मान लिया है कि संकलक मेरे बारे में "भी नया" तैनाती लक्ष्य OS संस्करण के लिए एपीआई उपयोग चेतावनी देगा देखें। लेकिन यह पता चला कि संकलक डिफ़ॉल्ट रूप से इसके बारे में आपको चेतावनी नहीं देता है। कारणों में से एक हो सकता है कि आप अभी भी "प्रतिक्रियाओं के चयनकर्ता:" के साथ रनटाइम के दौरान उपलब्धता की जांच करके नए एपीआई का उपयोग कर सकते हैं, उदाहरण के लिए, एक नए ओएस संस्करण पर जब तैनाती लक्ष्य संस्करण पुराना था। आपको संकलक विकल्प -Wpartial-उपलब्धता जोड़ना होगा जो "चेतावनी:" कुछ प्राप्त करने के लिए एक्सकोड 7.3+ (पुष्टि करने के लिए) पर उपलब्ध है: मैकोज़ 10.x "चेतावनी संदेश में पेश किया गया है।

MacOS 10.12.3 पर

Xcode 8.2.1 के साथ:

$ cat foo.m 
#include <Foundation/Foundation.h> 

BOOL foo() 
{ 
    return [@"foo" containsString:@"bar"]; 
} 

$ cc -mmacosx-version-min=10.9 -Wpartial-availability foo.m -c -o foo.o 
foo.m:5:20: warning: 'containsString:' is partial: introduced in macOS 10.10 [-Wpartial-availability] 
    return [@"foo" containsString:@"bar"]; 
       ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSString.h:132:1: note: 
     'containsString:' has been explicitly marked partial here 
- (BOOL)containsString:(NSString *)str NS_AVAILABLE(10_10, 8_0); 
^ 
foo.m:5:20: note: explicitly redeclare 'containsString:' to silence this warning 
    return [@"foo" containsString:@"bar"]; 
       ^
1 warning generated. 

यह भी देखें: Is there a way for XCode to warn about new API calls?