2012-11-07 6 views
20

यह एक्सकोड 4.5.x आईओएस armv7 armv7s और सिम और विशिष्ट रूप से एक्सकोड परियोजना सेटअप/प्रोजेक्ट बिल्ड सेटअप के बारे में है:आईओएस के साथ एक्सकोड - एक पुस्तकालय बनाना जो कि डीबग मोड में चलाने में आसान है, वितरित करें,

मेरे पास एक परियोजना "ए" है जो ऐप स्टोर में एक ऐप है। मेरे पास एक प्रोजेक्ट "बी" है जो एक लाइब्रेरी है जिसका प्रयोग ए में निर्भरता के रूप में किया जाएगा, लेकिन अन्य ऐप्स को उनके ऐप्स में उपयोग करने के लिए तीसरे पक्ष की लाइब्रेरी के रूप में भी वितरित किया जाएगा। (अन्य कंपनियों के तीसरे पक्ष के ऐप्स इस मामले में "वाई" के रूप में प्रतिनिधित्व किए जाते हैं)।

यहाँ आवश्यकताएँ हैं:

  • 'ए' को चलाने के लिए डिबग मोड में सक्षम होना चाहिए, और निश्चित रूप से डिबग नेस्ट 'बी' परियोजना समवर्ती, एक ही निर्माण/सत्र में।
  • "ए" से मैं सीएमडी + "बी" से एक विधि हस्ताक्षर पर क्लिक कर सकता हूं और उस src फ़ाइल में सीधे कूद सकता हूं, जहां मैं संपादित करने के लिए स्वतंत्र हूं और फिर पुन: संकलित करता हूं, जैसे कि यह एक ही प्रोजेक्ट से था।
  • किसी अन्य कंपनी में एक देव "एक्स" आसानी से हमारी लाइब्रेरी "बी" को अपनी परियोजना "वाई" में खींचने में सक्षम होना चाहिए, जहां "बी" एक स्थिर लाइब्रेरी है जिसमें केवल आवश्यक हेडर फाइलें उजागर हैं। "वाई" निश्चित रूप से "बी" की वास्तविक शीर्षलेख फ़ाइलों के उप-समूह से विधियों को कॉल करता है। इस सबसेट से केवल फाइलों को देव "एक्स" के वितरण में शामिल किया जाना चाहिए।
  • देव "एक्स" को अपने एक्सकोड प्रोजेक्ट में कुछ भी संशोधित करने की आवश्यकता नहीं है, बस अपने प्रोजेक्ट में "बी" (जिसमें स्थिर lib और हेडर फाइलों का सबसेट शामिल है) के लिए फ़ोल्डर खींचें और "संसाधन कॉपी करें," पर क्लिक करें संदर्भ, आदि "।
  • मुझे उसी फाइल के आधार पर आसानी से "बी" की स्थिर लाइब्रेरी निर्माण उत्पन्न करने में सक्षम होना चाहिए, क्योंकि मैं इस पूरे प्रोजेक्ट "ए" के अंदर इस परियोजना "बी" को पुन: सक्रिय और डीबग करता हूं। ।
  • "बी" में स्रोत कोड से कोई संसाधन नहीं है - इसमें कोई छवि संपत्तियां, xibs, या ऐसा कुछ भी नहीं है।
  • "बी" से, मैं "पुरालेख" और पोफ पर क्लिक करता हूं! एक स्थैतिक lib है (वसा बाइनरी होना चाहिए, इसका मतलब है कि यह सिम्युलेटर + armv7 + armv7s पर काम करता है, कृपया !!) वितरित करने के लिए तैयार आवश्यक शीर्षलेख फ़ाइलों के साथ।
  • यह सब ऐप स्टोर स्वीकृति -friendly
  • भी यह विश्वसनीय होना चाहिए। यह अच्छा नहीं है कि जब भी मैं एक फ़ाइल जोड़ता हूं तो मुझे बहुत सारे कॉन्फ़िगरेशन परिवर्तन करने के लिए वापस आना पड़ता है।

अद्यतन:
*सबसे महत्वपूर्ण: यह एक रेपो मैं बाहर की जाँच कर सकते हैं कि क्या देख रहा हूँ की एक पूरी एंड-टू-एंड टेम्पलेट है की जरूरत है, और मैं की जरूरत है एक्सकोड 4.5.2+ खोलने में सक्षम होने के लिए और खेलें क्लिक करें और यह चीज़ बनाएं, दर्द रहित। किसी को

500 अंक जो मुझे एक टेम्पलेट परियोजना है कि सब कुछ मैं ऊपर वर्णित है को दर्शाता है, 'ए', 'बी', और "Y" प्रदान कर सकते हैं ("बी" के साथ स्थिर lib एक डीईपी रूप में इस्तेमाल किया) । मुझे केवल कंकाल परियोजनाओं ("ए", "बी" ("ए" के अंदर घोंसला), और "वाई") का एक सेट है जो दिखाता है कि यह कैसे किया जा सकता है। बकाया पोस्ट होने तक उत्तर वापस न रखें। अगर यह मेरी आवश्यकताओं को पूरा करता है, तो मैं सुनिश्चित कर दूंगा कि आपको मेरे बक्षीस अंक मिलेंगे।

मैं कुछ हद तक चिंतित हूं कि एक्सकोड की सीमाओं के साथ कि यह एक ऐसे तरीके से भी संभव नहीं है जो पूरी तरह से परेशानी न हो। कृपया मुझे गलत साबित करें।

अद्यतन: मैंने फैसला किया कि मुझे अब armv6 की परवाह नहीं है। अलविदा, armv6। अतिरिक्त क्रेडिट यदि आप armv6 को armv7, armv7s, i386/simulator के साथ dist आउटपुट में घुमा सकते हैं।

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

उत्तर

6

यह अकेले एक्सकोड में संभव नहीं होगा। संकलन लक्ष्य स्विच (सिम्युलेटर, डिवाइस इत्यादि) के कारण आपको कुछ बिल्ड स्क्रिप्ट्स (जिन्हें आप निश्चित रूप से एक्सकोड के भीतर से कॉल कर सकते हैं) की आवश्यकता होगी।

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

मैंने libturbojpeg के लिए ऐसा कुछ किया, संदर्भ के लिए https://github.com/dunkelstern/libturbojpeg-ios देखें। यदि आप टर्मिनल से "build.sh" फ़ाइल को कॉल करते हैं, तो यह वर्तमान में "lib" में एक वसा लाइब्रेरी रखता है, लेकिन वितरण शीर्षलेख को छोड़ देता है। Libturbojpeg के मामले में मुझे 2 प्रोजेक्ट फाइलों की आवश्यकता थी क्योंकि प्रत्येक लक्ष्य लाइब्रेरी में असेंबलर फ़ाइलों के एक अलग सबसेट को संकलित करता है (बेहतर असेंबलर मेकफ़ाइल सामग्री को न देखें)। संकलित करने के लिए आपको NASM के हाल के संस्करण की आवश्यकता होगी क्योंकि संस्करण सेब जहाजों प्राचीन हैं (इसे ब्रू के साथ प्राप्त करें)। मैं जल्द ही उसी खाते पर ऐसी लाइब्रेरी बिल्ड प्रोजेक्ट के लिए एक टेम्पलेट पोस्ट करूंगा। (संपादित करने या अगर उचित लिंक के साथ यहाँ किया टिप्पणी करेंगे)

मूल रूप से यह इस तरह काम करता है:

  1. निर्माण स्क्रिप्ट है कि प्रत्येक की जरूरत मंच लक्ष्य
  2. Xcode पुस्तकालय परियोजना को रोकने के लिए है के लिए xcodebuild कॉल बनाएं एक स्क्रिप्ट का निर्माण स्क्रिप्ट पा सकते हैं
  3. अतिरिक्त हेडर एक "कॉपी फ़ाइलें" लक्ष्य कार्रवाई
  4. निर्माण स्क्रिप्ट सभी पुस्तकालयसाथ बनाता है मर्ज करने के लिए है से कॉपी किया जा करने के लिए है एक निर्देशिका में बनाया पुस्तकालयों ड्रॉप करने
  5. अपने निर्माण के रूप में "रन स्क्रिप्ट" लक्ष्य का निर्माण स्क्रिप्ट जोड़ें, लेकिन आप एक अनंत लूप का निर्माण नहीं करतीं (या बस एक रिलीज निर्माण बनाने के लिए टर्मिनल से यह कहते हैं)
  6. अपने मुख्य परियोजना को जोड़ने में बारे में पता होना पुस्तकालय subproject

फिर आप की नकल की हेडर फाइल के साथ उत्पादन dir वितरित करने और lipo विलय कर दिया सार्वभौमिक पुस्तकालय और अपने कार्यक्षेत्र आप सामान्य रूप से करना होगा के रूप में में subproject के रूप में सामान्य रूप से पुस्तकालय का उपयोग कर सकते हैं (यह बनाता है और लिंक केवल जरूरत libs फिर, सार्वभौमिक lib नहीं, लेकिन यह कोई समस्या नहीं होनी चाहिए)

यह वास्तव में लाइब्रेरी के लिए DSYM फ़ाइलों को बनाने की समस्या को हल नहीं करता है। लेकिन डीबग निर्माण के निर्माण के दौरान आम तौर पर डिबगिंग प्रतीक लाइब्रेरी में होना चाहिए। यह रिलीज बिल्ड पर डिबगिंग प्रतीकों को पट्टी कर देगा और आपके पास तब कोई DSYM नहीं होगा।

उदाहरण परियोजना के लिए लिंक: https://github.com/dunkelstern/StaticLibraryTemplate

+0

उत्तर देने के लिए धन्यवाद, पहली नज़र में आशाजनक लग रहा है। एक बार मेरे पास एक मुफ्त पल हो जाने के बाद मैं इसे बाद में डुबो दूंगा। अगर यह मेरी समस्याओं को हल करता है, तो मैं आपको अंक दूंगा। यह "12 घंटे" कहता है जब तक कि मैं वैसे भी बक्षीस की पेशकश नहीं कर सकता। धन्यवाद!! – jpswain

+0

तो मैं बस अपनी libturbojpeg परियोजनाओं के माध्यम से जा रहा था। कुछ बॉलर सी-कोड की तरह दिखता है। मुझे पता है कि बिल्डों को गठबंधन करने के लिए लिपो का उपयोग कैसे करें, लेकिन वास्तव में सभी के ऊपर निर्भर करता है कि मैं अपने स्थिर lib प्रोजेक्ट को निर्भर परियोजना के अंदर सामान्य स्रोत कोड के रूप में और एक स्थिर पुस्तकालय के रूप में समान रूप से अच्छी तरह से और आसानी से स्वीकार्य रूप से चला सकूं। क्या आपके पास ऐसा उदाहरण है जिसमें libturbojepg को इस तरह से शामिल किया गया है? धन्यवाद!! जेमी – jpswain

+0

बस अपनी प्रोजेक्ट में अपनी लाइब्रेरी के निर्माण के लिए प्रोजेक्ट फ़ाइल ड्रॉप करें, वर्कस्पेस न बनाएं लेकिन इसे अपने प्रोजेक्ट ट्री में छोड़ दें। यह libturbojpeg प्रोजेक्ट के साथ काम नहीं करेगा क्योंकि इसमें 2 विशिष्ट आर्किटेक्चर हैं। फिर अपने मुख्य प्रोजेक्ट बिल्ड चरण में निर्भरता बनाएं और लिंक चरण में * .a फ़ाइल डालें। इस तरह: http://media.dunkelstern.de/images/Xcode_library_project.png – Dunkelstern

3

मैं काफी अपनी आवश्यकताओं के कुछ इसी तरह प्राप्त करने के लिए https://github.com/jverkoey/iOS-Framework उपयोग कर रहा हूँ। उसे सभी श्रेय दें, मैं बस संक्षेप में बता रहा हूं कि मैं इसे कैसे करता हूं।

हमेशा की तरह एक स्थिर पुस्तकालय प्लस इन तोड़ मरोड़ बनाएँ:

  • एक प्रति फ़ाइलें हेडर कॉपी करने के लिए चरण जोड़ें। मैं उचित "कॉपी हेडर" चरण का उपयोग नहीं करता क्योंकि मैंने कहीं पढ़ा है आईओएस स्थिर पुस्तकालयों के लिए इसकी अनुशंसा नहीं की जाती है।
    • गंतव्य: उत्पाद निर्देशिका
    • सब-पाथ: ${PROJECT_NAME}/Headers
  • बदलें कुछ सेटिंग:
    • "डेड कोड स्ट्रिपिंग" => नहीं (सभी सेटिंग के लिए)
    • "पट्टी डीबग चिह्न के दौरान कॉपी करें "=> नहीं (सभी सेटिंग्स के लिए)
    • " स्ट्रिप स्टाइल "=> गैर-वैश्विक प्रतीक (सभी सेटिंग्स के लिए)
  • पुस्तकालय के साथ एक रूपरेखा तैयार करने के लिए एक रन स्क्रिप्ट जोड़ें:
    • स्क्रिप्ट prepare_framework.sh का प्रयोग करें।

आपको अपने एप्लिकेशन में स्थिर पुस्तकालय परियोजना का उपयोग कर सकते हैं: यह अपने ऐप्स प्रोजेक्ट पर खींचें, निर्भरता और इसके साथ कड़ी के रूप में .a पुस्तकालय जोड़ें। आप आदि अपने अनुप्रयोग के साथ पुस्तकालय डीबग कर सकते हैं, तरीकों में कदम, प्रतीक परिभाषाओं पर जाएँ,

तैयार ढांचा एक द्विआधारी संस्करण वितरित करने के लिए उपयोग किया जाएगा: एक सकल जोड़ने

ही स्थिर पुस्तकालय परियोजना में लक्ष्य:

  • स्थैतिक पुस्तकालय निर्भरता के रूप में जोड़ें।
  • लापता आर्किटेक्चर बनाने के लिए एक रन स्क्रिप्ट चरण जोड़ें। स्क्रिप्ट build_framework.sh का उपयोग करें।

स्क्रिप्ट लगता अन्य मंच क्या और xcodebuild यह संकलित करने के लिए इस्तेमाल करते हैं। फिर सभी आर्किटेक्चर के साथ एक वसा बाइनरी बनाने के लिए lipo का उपयोग करें। वसा स्थैतिक पुस्तकालय का गंतव्य हमारे द्वारा बनाए गए ढांचे के पेड़ होगा। अंतिम ढांचे को बिल्ड फ़ोल्डर में उत्पाद फ़ोल्डर में कॉपी किया गया है। नेस्ट परियोजना के रूप में स्थिर पुस्तकालय के साथ अपने अनुप्रयोग

  • बिल्ड और डिबग:

    इस दृष्टिकोण के साथ आप कर सकते हैं

  • लाइब्रेरी के एक वितरक संस्करण को एक चरण फ्रेमवर्क-जैसे बंडल में एम्बेडेड शीर्षकों के साथ बनाएं। निर्मित ढांचा परियोजना उत्पाद निर्देशिका में स्थित है।
  • एक्सकोड आर्काइव फ़ंक्शन का उपयोग करें। किसी कारण से अंतिम फ़ाइलों को संग्रह स्थान पर कॉपी नहीं किया गया है। आप ढांचे के एक छीन संस्करण बनाने के लिए इसका उपयोग कर सकते हैं।

लाइब्रेरी को पैकेज करने के लिए इस तकनीक का उपयोग करके एक परियोजना को क्लोन करने के लिए स्वतंत्र महसूस करें: json-framework fork। मैंने थोड़ा स्क्रिप्ट संशोधित की है, iOS-framework का मेरा कांटा जांचें।

armv6 के बारे में, मुझे तुम्हारी जरूरत है लगता है और पुराने iOS SDK 4.3 और वैध आर्किटेक्चर और वास्तविक आर्किटेक्चर की सूची में मैन्युअल रूप से शाब्दिक armv6 जोड़ें। मेरे पास अभी परीक्षण करने के लिए पुराना एसडीके नहीं है।

+0

धन्यवाद आदमी!मैं काम के बाद आज रात आपके समाधान और @ डंकेलस्टर्न के समाधान दोनों को आजमाने की उम्मीद करूँगा। Armv6 के लिए, मैं वास्तव में इसके बारे में और अधिक मस्तिष्क क्षति करने के लिए पर्याप्त परवाह नहीं करता हूं। ऐप्पल एक्सकोड से इसे हटाकर किसी भी तरह से उस कमान को त्यागने के लिए मजबूर कर रहा है। – jpswain

+0

यह बात बहुत अच्छी है, यकीन नहीं है कि मैं इसे अभी तक एक ढांचे पर स्विच करने के लिए तैयार हूं, लेकिन मुझे इसे एक ही समय में पसंद है। मैं विशेष रूप से देख सकता हूं कि यह उन परियोजनाओं के लिए बहुत अच्छा होगा जो ज़िब्स, इमेज इत्यादि जैसे बहुत सारे संसाधनों का उपयोग करते हैं। – jpswain

+1

में मेरे जवाब में संसाधनों का एक बंडल (xibs, pngs, आदि) शामिल नहीं था, केवल 'नकली आईओएस ढांचा। असल में, इस ढांचे में * वही * स्थिर लाइब्रेरी है जो * समान * लिपो टूल और रन स्क्रिप्ट के साथ बनाई गई है (कोई अन्य तरीका नहीं है)। यह हेडर पथ को स्वचालित रूप से कॉन्फ़िगर करने और एक्सकोड और फाइंडर में बंडल के रूप में दिखने का लाभ है। यह कोई ब्रेनर IMHO नहीं है। – djromero

2

Cocoapods आपकी आवश्यकताओं को शामिल करता है। हालांकि इसका उपयोग करने का मानक तरीका एक केंद्रीय गिट रेपो में पॉड चश्मा जमा करना है। यह वितरण के लिए वैकल्पिक रिपो जोड़ने, या मैन्युअल रूप से उन्हें बनाने का समर्थन करता है, here देखें। कोकोपोड्स का उपयोग करने के फायदे यह होंगे कि यह दोनों आपकी सभी आवश्यकताओं को पूरा करता है और यह पुस्तकालयों को वितरित करने का एक बहुत ही मानक तरीका बन रहा है (उदाहरण के लिए फेसबुक & स्टैकमोब जैसी कंपनियों द्वारा उपयोग किया जाता है) और ओपन सोर्स (उदा। नेटवर्कवर्किंग)। इसलिए, यदि आप भविष्य में या भविष्य में तीसरे पक्ष के पुस्तकालयों पर निर्भर करते हैं, तो संभावना है कि कोकोपोड आपको उस निर्भरता को संभालने में मदद करेगा।

+0

दुर्भाग्यवश, कोकोपोड्स की आवश्यकता कुछ ऐसा नहीं है जिसे मैं तृतीय पक्ष के ग्राहकों पर लगा देना चाहता हूं। मैंने व्यक्तिगत रूप से अभी तक कोशिश नहीं की है, लेकिन यह एक अच्छा विचार की तरह लगता है। – jpswain

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