IOS / OSX फ्रेमवर्क बनाना: क्या अन्य डेवलपर्स को वितरित करने से पहले उन्हें कोड करना आवश्यक है?


90

मैं सीख रहा हूं कि आईओएस और ओएसएक्स फ्रेमवर्क कैसे बनाएं। उदाहरण के लिए आइओएस लेते हैं, मेरे लिए अभी तक निम्न चरण काम करते हैं:

  1. xcodebuild का उपयोग कर -sdk iphonesimulator और बिल्ड कार्रवाई
  2. xcodebuild का उपयोग करते हुए -sdk iphoneos और बिल्ड एक्शन
  3. सार्वभौमिक बाइनरी बनाने के लिए लिपो टूल का उपयोग करें ताकि lipo -infoअपेक्षित उत्पादन हो:

वसा फ़ाइल में आर्किटेक्चर: Foo.framework / Foo हैं: i386 x86_64 armv7 arm64

प्रश्न हैं:

  1. मैंने पढ़ा कि मेरे फ्रेमवर्क को डेवलपर द्वारा फिर से हस्ताक्षरित किया जा सकता है, जो इसका उपयोग कर रहा है: "कोड साइन ऑन कॉपी" लेकिन मुझे समझ में नहीं आता कि इसके लिए पूर्व शर्त क्या हैं? क्या मुझे कोड साइन करने के लिए कोडसाइन स्टेप जोड़ना चाहिए, ताकि मेरी हस्ताक्षर पहचान के साथ उस सार्वभौमिक द्विआधारी से पहले इसे अन्य डेवलपर्स को वितरित करना?

  2. यदि पिछला सकारात्मक है - तो क्या मुझे अपने "iPhone वितरण: ..." पहचान या "iPhone डेवलपर: ..." का उपयोग करना चाहिए (इतना है कि मेरा ढांचा कुछ iOS परियोजना का हिस्सा होने के नाते सभी प्रकार के सत्यापन विशेष रूप से ऐप स्टोर सत्यापन से गुजरता है ) ?.

मेरे उत्तर के लिए पृष्ठभूमि "कोडसाइन एरर है: एसडीके 'आईओएस 8.3' में उत्पाद प्रकार 'फ्रेमवर्क' के लिए कोड हस्ताक्षर की आवश्यकता है, जिसे मैंने कई तृतीय-पक्ष रूपरेखाओं और कार्टेज # 235 पर देखा है या" कोड ऑब्जेक्ट पर हस्ताक्षर नहीं किया गया है सब पर "(एक उदाहरण: मुद्दा मैंने Realm # 1998 पर रिपोर्ट किया है ।

इसलिए मैं यह सुनिश्चित करना चाहता हूं कि मेरे ढांचे के उपयोगकर्ता किसी भी कोडिंग मुद्दों का सामना नहीं करेंगे जब वे उनका उपयोग करेंगे।

PS यह प्रश्न और भी दिलचस्प हो जाता है जब किसी एकल डेवलपर के लिए नहीं बल्कि एक संगठन के लिए लागू किया जाता है जो एक फ्रेमवर्क विक्रेता होता है।


यह टिप्पणी 'CODE_SIGN_IDENTITY = iPhone डेवलपर' का उपयोग करने का सुझाव देती है, लेकिन यह स्पष्ट नहीं है कि 'iPhone वितरण' के बजाय 'डेवलपर' का उपयोग क्यों किया जाता है।
स्टानिस्लाव पानकेविच

संबंधित विषय: एम्बेडेड फ्रेमवर्क के साथ निर्यात एप्लिकेशन लेकिन कोई निश्चित उत्तर नहीं है।
स्टानिस्लाव पानकेविच

मैंने इस प्रश्न को Apple Developer Forums: मंचों . developer.apple.com/thread/6400 पर भी डुप्लिकेट किया है
स्टानिस्लाव पानकेविच

मेरे पास एक सवाल है जब आप अपने ढांचे को वितरित करते हैं, तो आप डिबग बिल्ड या रिलीज़ बिल्ड वितरित करते हैं? और यदि आप इसे रिलीज़ बिल्ड में वितरित करते हैं, तो यह कैसे करें?
निकम्मा

: @ niczm25, यह कैसे मैं यह कर का एक तरीका है stanislaw.github.io/2015/11/23/...
स्टानिस्लाव पानकेविच

जवाबों:


137

मैंने इनाम खोला: "विश्वसनीय और / या आधिकारिक स्रोतों से उत्तर ड्राइंग की तलाश में।" लेकिन तब से ऐसा प्राप्त नहीं हुआ है।

जबकि @jackslash द्वारा प्रदान किया गया उत्तर सही है, यह केवल कहानी का एक हिस्सा बताता है इसलिए मैं अपना खुद का एक तरह से लिखना चाहता हूं जिस समय मैं यह सवाल पूछ रहा था, मैं इसे देखना चाहता हूं।

इस उत्तर की वास्तविकता यह है: जुलाई 2015. यह सबसे अधिक संभावना है कि चीजें बदल जाएंगी।

सबसे पहले यह दावा करते हैं कि फ्रेमवर्क के सही कोड पर हस्ताक्षर के लिए आवश्यक क्रियाओं को उन चरणों में विभाजित किया जाना चाहिए, जिन्हें फ्रेमवर्क के डेवलपर को लेना है और उस फ्रेमवर्क के उपभोक्ता को जो कदम उठाने हैं।

TLDR;

OSX फ्रेमवर्क के लिए: डेवलपर इसे कोड किए बिना OSX फ्रेमवर्क को वितरित करने के लिए स्वतंत्र है क्योंकि उपभोक्ता इसे फिर से कोड-असाइन करेगा।

आईओएस फ्रेमवर्क के लिए: डेवलपर आईओएस फ्रेमवर्क को कोड किए बिना वितरित करने के लिए स्वतंत्र है क्योंकि उपभोक्ता इसे फिर से कोड-असाइन करेंगे, लेकिन डेवलपर को अपने डिवाइस को आईओएस डिवाइस के लिए बनाने पर एक्सकोड द्वारा मजबूर किया जाता है।

रडार के कारण: "सिम्युलेटर स्लाइस वाले iOS फ्रेमवर्क को ऐप स्टोर में प्रस्तुत नहीं किया जा सकता है" आईओएस फ्रेमवर्क के उपभोक्ता को "कॉपी_फ्रेमवर्क" या "स्ट्रिप_फ्रेमवर्क" जैसी विशेष स्क्रिप्ट चलाने के लिए मजबूर किया जाता है, जो lipo -removeआईओएस फ्रेमवर्क और फिर से सिम्युलेटर स्लाइस को बंद करने के लिए उपयोग करता है। -कोडाइन स्ट्रिप्ड फ्रेमवर्क क्योंकि इस बिंदु पर इसकी कोडिंग पहचान जो कुछ भी थी (या नहीं थी) lipo -removeहेरफेर के साइड इफेक्ट के रूप में हटा दी जाती है ।

लंबे समय तक जवाब इस प्रकार है।


यह उत्तर "विश्वसनीय और / या आधिकारिक स्रोतों से ड्राइंग" एक नहीं है, बल्कि कई अनुभवजन्य टिप्पणियों पर आधारित है।

अनुभवजन्य अवलोकन # 1: उपभोक्ता परवाह नहीं करता है क्योंकि वे डेवलपर से प्राप्त होने वाले ढांचे को फिर से-कोड करेंगे

जीथब पर प्रसिद्ध ओपन सोर्स परियोजनाओं के बाइनरी फ्रेमवर्क वितरण को कोड नहीं किया गया है । कमांड codesign -d -vvvvदेता है: "बाइनरी आईओएस और ओएसएक्स फ्रेमवर्क के सभी पर" कोड ऑब्जेक्ट पर हस्ताक्षर नहीं किया गया है जो मैंने खोजा था। कुछ उदाहरण: ReactiveCocoa और मेंटल , रियल , प्रोमिसकिट

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

मुझे इसके विपरीत का कोई एकल उदाहरण नहीं मिला: खुला स्रोत ढांचा, जिसे कोडिंग पहचान के साथ वितरित किया जाएगा इसलिए शेष उत्तर में मैं इसे व्यापक रूप से अपनाए गए दृष्टिकोण को सही मान रहा हूं: फ्रेमवर्क की कोई आवश्यकता नहीं है। इसमें कोडिंग पहचान के साथ अन्य डेवलपर्स के लिए अपने ढांचे को वितरित करें क्योंकि उपभोक्ता वैसे भी इसे फिर से कोडिंग करेगा

अनुभवजन्य अवलोकन # 2 जो केवल iOS पर लागू होता है और जो पूरी तरह से डेवलपर की चिंता है

हालांकि उपभोक्ता को इस बात की परवाह नहीं है कि उन्हें डेवलपर से जो फ्रेमवर्क प्राप्त हुआ है वह कोडेड है या नहीं, डेवलपर को अभी भी अपनी iOS प्रक्रिया को इसके निर्माण की प्रक्रिया के हिस्से के रूप में कोड करने की आवश्यकता है , जब वे इसे iOS डिवाइस के लिए बनाते हैं क्योंकि अन्यथा Xcode का निर्माण नहीं होता है CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1':। जस्टिन स्पाहर-समर्स को उद्धृत करने के लिए :

OS X फ्रेमवर्क को बिल्ड में कोड किए जाने की आवश्यकता नहीं है ... दुर्भाग्य से, Xcode की आवश्यकता है कि आईओएस फ्रेमवर्क को बिल्ड टाइम पर कोड किया जाए।

यह मेरे प्रश्न # 2 पर बहुत अच्छी तरह से उत्तर देता है: "iPhone डेवलपर" पहचान एक्सकोड को काजोल करने के लिए पर्याप्त है ताकि यह डिवाइस के लिए आईओएस फ्रेमवर्क का निर्माण करे। कार्थेज # 339 पर यह टिप्पणी एक ही बात कहती है।

अनुभवजन्य अवलोकन # 3: लाइपो उपकरण

लाइपो उपकरण के विशिष्ट व्यवहार: जब ढांचा द्विआधारी के लिए आवेदन किया है, यह हमेशा रिकर्सिवली किसी भी codesign पहचान यह से निकाल देता है : lipo -create/-remove codesigned framework ... -> not codesigned framework

यह एक उत्तर हो सकता है कि क्यों अवलोकन # 1 में सभी उदाहरणों को संहिताबद्ध नहीं किया गया है: लिपो लागू होने के बाद उनकी कोडिंग पहचान को उड़ा दिया जाता है, लेकिन अवलोकन के अनुसार # 1 उपभोक्ता का ध्यान नहीं है कि यह ठीक है।

यह अवलोकन विशेष रूप से AppStore के बारे में अगले अवलोकन # 4 के लिए प्रासंगिक है।

अनुभवजन्य अवलोकन # 4: सिम्युलेटर स्लाइस वाले iOS फ्रेमवर्क को ऐप स्टोर में प्रस्तुत नहीं किया जा सकता है

यह व्यापक रूप से चर्चा में है: दायरे # 1163 और कार्थेज # 188 और राडार खोला गया है: rdar: // 19209161

यह पूरी तरह से उपभोक्ता की चिंता है: आईओएस यूनिवर्सल फ्रेमवर्क के लिए जिसे उपभोक्ता अपने आवेदन में शामिल करते हैं, जब एप्लिकेशन बनाया जा रहा होता है, तो उन्हें विशेष स्क्रिप्ट (कस्टम रन स्क्रिप्ट फेज) को चलाना चाहिए जो उस फ्रेमवर्क के बाइनरी से सिम्युलेटर स्लाइस को हटा देता है ताकि ऐप ऐपस्टोर सत्यापन को पास कर सके।

बाइनरी फ्रेमवर्क के लिए अच्छा उदाहरण मुझे रियलम में मिला: स्ट्रिप -फ्रैमवर्कसेश

यह lipoआर्किटेक्चर के सभी स्लाइस को हटाने के लिए उपयोग करता है ${VALID_ARCHS}और फिर इसे उपभोक्ता की पहचान के साथ फिर से कोड करता है - यह वह जगह है जहां # 3 kicks in: Framework का पुन: कोडाइन किया जाना है क्योंकि उस पर लाइपो जोड़-तोड़ है।

कार्थेज में CopyFrameworks.swift स्क्रिप्ट है जो उपभोक्ता द्वारा शामिल सभी रूपरेखाओं के लिए एक ही काम करता है: यह उपभोक्ता की ओर से सिम्युलेटर स्लाइस और री-कोडसाइन फ्रेम से स्ट्रिप्स करता है।

इसके अलावा एक अच्छा लेख है: Xcode में डायनामिक लाइब्रेरी से अनचाहे आर्किटेक्चर को अलग करना


अब डेवलपर और उपभोक्ता दोनों के दृष्टिकोण से iOS और OSX दोनों के उत्पादन के लिए आवश्यक चरणों का अवलोकन। पहले आसान एक:

OSX

डेवलपर:

  1. OSX फ्रेमवर्क बनाता है
  2. इसे उपभोक्ता को देता है

डेवलपर से किसी भी कोडिंग गतिविधियों की आवश्यकता नहीं है।

उपभोक्ता:

  1. डेवलपर से OSX फ्रेमवर्क प्राप्त करता है
  2. "फ्रेमवर्क ऑन कॉपी" कोड के हिस्से के रूप में फ्रेमवर्क / डायरेक्टरी में फ्रेमवर्क को कॉपी करता है और अपने आप, कंज्यूमर की ओर से इसे अपने आप कोड करता है।

आईओएस

डेवलपर:

  1. डिवाइस के लिए iOS फ्रेमवर्क बनाता है। कोडकोडिंग की आवश्यकता है Xcode, "iPhone डेवलपर" की पहचान पर्याप्त है।
  2. सिम्युलेटर के लिए आईओएस फ्रेमवर्क बनाता है।
  3. पिछले दो से सार्वभौमिक iOS ढांचे का निर्माण करने वाले लाइपो का उपयोग करता है। इस बिंदु पर 1 चरण की कोडिंग पहचान खो गई है: सार्वभौमिक फ्रेमवर्क बाइनरी "पर हस्ताक्षर नहीं किया गया है" लेकिन यह ठीक है क्योंकि "उपभोक्ता परवाह नहीं करता है"।
  4. इसे उपभोक्ता को देता है

उपभोक्ता:

  1. डेवलपर से iOS फ्रेमवर्क प्राप्त करता है
  2. फ्रेमवर्क / डायरेक्टरी में कॉपियों की रूपरेखा
  3. निर्माण प्रक्रिया के एक भाग के रूप में विशेष स्क्रिप्ट का उपयोग करता है: यह स्क्रिप्ट आईओएस फ्रेमवर्क से स्ट्रिप्स सिम्युलेटर स्लाइस करता है और फिर उनके, कंज्यूमर, ओर से इसे फिर से कोड करता है।

9
यह एक मूल्यवान लेखन है। एक अच्छा
jackslash

@Stanislaw अंतर्दृष्टि और मूल्यवान डेटा के लिए धन्यवाद। जैसा कि मैं डेवलपर्स के लिए डिज़ाइन किया गया मेरा स्वयं का एक फ्रेमवर्क लिख रहा हूं, मैं चाहता हूं कि वे फ्रेमवर्क को लेने में सक्षम हों और इसका उपयोग बिना किसी विशेष स्क्रिप्ट को बनाने के लिए ऐप-स्टोर पर अपलोड करने की आवश्यकता के बिना करें। मुझे लगता है कि GoogleMobileAd उस तरह से काम करते हैं। लेकिन आप कहते हैं कि वे कुछ स्क्रिप्ट चलाना चाहिए? आपको पता है कि GoogleMobileAds को इसकी आवश्यकता नहीं है? धन्यवाद
माइकल ए

@ मिचैल, वास्तव में यह दिलचस्प है। मैं देखूंगा।
स्टानिस्लाव पानकेविच

क्या आप मुझे GoogleMobileAds का लिंक दे सकते हैं जिसका आप उपयोग कर रहे हैं?
स्टानिस्लाव पानकेविच 12

1
मेरा समय बचाने के लिए धन्यवाद, मेरे लिए काम किया। Xcode 7.3, Mac OS X 10.11.4।
यूजेन

21

कार्थेज रेपो पर जुड़े धागे को पढ़ने से यह अपेक्षाकृत सरल लगता है। यदि आप द्विआधारी ढांचे को वितरित कर रहे हैं, तो आपको इसे साइन इन करने की आवश्यकता है और यदि आप स्रोत को कार्टाज या कोको पॉड्स के माध्यम से वितरित कर रहे हैं, तो आप नहीं करते हैं क्योंकि वे उपकरण विभिन्न तरीकों के माध्यम से इस बात का ध्यान रखते हैं।

जब आप बाइनरी फ्रेमवर्क वितरित करते हैं, तो कोड पर हस्ताक्षर करने का कारण यह है कि कोड पर हस्ताक्षर किए बिना Xcode एक फ्रेमवर्क बाइनरी का उत्पादन नहीं करेगा। यदि आप इस त्रुटि को प्राप्त करने वाले द्विआधारी ढांचे पर हस्ताक्षर नहीं करने का प्रयास करते हैं:

CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'

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

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


आपके उत्तर में, इसके दूसरे पैराग्राफ में, आप कह रहे हैं कि कोडसाइन फ्रेमवर्क की कोई आवश्यकता नहीं है क्योंकि यह उपभोक्ता द्वारा फिर से कोड-असाइन किया जाएगा और मुझे अब 95% यकीन है कि यह सच है, लेकिन मुझे नहीं मिला एक ही समय में पहले पैराग्राफ में आप यह क्यों कह रहे हैं: "यदि आप द्विआधारी ढांचे को वितरित कर रहे हैं, तो आपको इसे कोड करने की आवश्यकता है" - क्या अंतर है - अगर मैं बाइनरी फ्रेमवर्क वितरित करता हूं (अर्थात कार्टेज या कोकोपोड्स के माध्यम से इसका स्रोत नहीं) क्यों मुझे इसे कोड करने की आवश्यकता होगी?
स्टैनिस्लाव पानकेविच

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

इसलिए मैं आपके "आपके बाइनरी फ्रेमवर्क को वितरित कर रहा हूं, तो आपको थोड़ा सा भ्रम हो सकता है कि आपको कोड पर हस्ताक्षर करने की आवश्यकता है" जो कि (imho) आपके शेष उत्तर का विरोधाभास करता है। कृपया स्पष्ट करें। कृपया यह भी ध्यान दें कि मैंने यह इनाम "विश्वसनीय और / या आधिकारिक स्रोतों से उत्तर ड्राइंग की तलाश में" के रूप में खोला है।
स्टैनिस्लाव पानकेविच

1
हां, मैंने Realm और OCMockito को भी देखा है। दायरे में "iPhone डेवलपर" की पहचान है और हां, OCMockito एक स्थिर पुस्तकालय है। मुझे लगता है कि मैं इस मुद्दे को समझता हूं - यह लिपो है जो iphoneos से कोडसाइनिंग को हटाता है जब यह संहिताबद्ध iphoneos को जोड़ती है और न कि संहिताबद्ध iphonesimulator को।
स्टानिस्लाव पानकेविच

1
मेरे पास एक सवाल है जब आप अपने ढांचे को वितरित करते हैं, तो आप डिबग बिल्ड या रिलीज़ बिल्ड वितरित करते हैं? और यदि आप इसे रिलीज़ बिल्ड में वितरित करते हैं, तो यह कैसे करें?
निकम्मा

1

ऊपर स्टैनिस्लाव पानकेविच का जवाब बहुत मान्य और सही है। लेकिन कृपया ध्यान दें कि Xcode 9.4 के रूप में, IDE आपको iOS कोको टच फ्रेमवर्क के लिए कोड साइनिंग को अक्षम करने के लिए कहेगा। यहां Apple अब कहता है कि यह अनुशंसित नहीं है कि आप कोड को अपने .framework पर हस्ताक्षर करते हैं।

आशा है कि ये आपकी मदद करेगा।


1
क्या आपके पास ऐप्पल के लिए एक स्रोत है जो हस्ताक्षर करने के ढांचे के खिलाफ सिफारिश कर रहा है?
रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.