क्या आप iOS के लिए डायनामिक लाइब्रेरी बना सकते हैं और उन्हें रनटाइम पर लोड कर सकते हैं?


114

क्या iOS (iPhone / iPad) पर डायनामिक लाइब्रेरी समर्थित हैं?

Xcode में, मैंने एक नया प्रोजेक्ट बनाने की कोशिश की -> फ्रेमवर्क एंड लाइब्रेरी -> कोको लाइब्रेरी (डायनेमिक) । प्रोजेक्ट सेटिंग्स में, मैंने बेस SDK को सेट iOS device 4.1और टारगेट किया iOS4.1, लेकिन इसमें बिल्ड एरर है:

लक्ष्य उत्पाद प्रकार 'com.apple.product-type.library.dynamic' को निर्दिष्ट करता है, लेकिन 'iphonesimulator' प्लेटफ़ॉर्म के लिए ऐसा कोई उत्पाद प्रकार नहीं है।

मेरे द्वारा चयनित बिल्ड सिम्युलेटर है -> डीबग -> i386



4
iOS8 + साझा लाइब्रेरी के आधार पर चौखटे का समर्थन करता है।
eonil

1
@ Eonil, क्या आप उस पर विस्तार कर सकते हैं? मैं इसके बारे में और अधिक जानकारी प्राप्त करना चाहूंगा, कुछ जानकारी के लिए एक लेख या लिंक बहुत सराहना की जाएगी।
मैक्सिम चेट्रस्का

जवाबों:


105

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

हालांकि, iOS8 में आप डायनेमिक लाइब्रेरी और फ्रेमवर्क का उपयोग कर सकते हैं। यह "सिर्फ काम" होना चाहिए


14
किसी को पता है कि क्यों है? मेरे लिए यह पूरी तरह से पागलपन लगता है।
एरिक डे कास्त्रो लोपो

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

6
मैं एक इन-हाउस ऐप विकसित कर रहा हूं जिसे AppStore के माध्यम से वितरित नहीं किया जाएगा, इसलिए मुझे ऐपस्टोर के लिए Apple के प्रतिबंधों की परवाह नहीं है। क्या iOS ऐप के लिए गतिशील लाइब्रेरी बनाना तकनीकी रूप से संभव है?
अलकासी

3
@ अलियासी: तकनीकी रूप से हाँ, या फिर आप Apple के पुस्तकालयों से लिंक नहीं कर पाएंगे। AFAIK डायनामिक लाइब्रेरी सपोर्ट मैक ओएस एक्स की तरह ही है। हालाँकि, Xcode इसे सपोर्ट नहीं करता है, लेकिन ऐसा लगता है कि आप बंडलों का उपयोग कर सकते हैं। इस लेख को देखें
डार्क डस्ट

3
समर्थित नहीं है जैसा कि अनुमति नहीं है।
dtech

162

मैं डार्कडस्ट के जवाब से वास्तव में असहमत नहीं हूं , लेकिन अगर मैं अपने आंतरिक बिल क्लिंटन को चैनल कर सकता हूं, तो यह इस बात पर निर्भर करता है कि समर्थित का अर्थ क्या है :)

Apple नहीं चाहता है कि आप ऐप स्टोर ऐप्स के लिए ऐसा करें, लेकिन ऑपरेटिंग सिस्टम निश्चित रूप से इसकी अनुमति देता है। जेलब्रेक ऐप हर समय इस तकनीक का उपयोग करते हैं। आप मूल रूप से एक फ्रेमवर्क / लाइब्रेरी खोलने के लिए एक मानक UNIX तकनीक का उपयोग करते हैं, और फिर उसमें सामान का उपयोग करते हैं। Dlopen समारोह आप में पास करके पुस्तकालय खोलने के लिए अनुमति देता है कि ढांचे के लिए पथ , या dylib। जेलब्रेक ऐप्स के निर्माण के लिए कुछ डॉक्स से , यहां init()अपने स्वयं के अंदर कार्यान्वित एक फ़ंक्शन को कॉल करने का एक उदाहरण है , अलग dylib:

#include <dlfcn.h>

initWrapper() {
    char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";

    void *libHandle = dlopen(dylibPath, RTLD_NOW);
    if (libHandle != NULL) {
        // This assumes your dylib’s init function is called init, 
        //    if not change the name in "".
        void (*init)() = dlsym(libHandle, "init");
        if (init != NULL)  {
            init();
        }
        dlclose(libHandle);
    }
}

इसके अलावा, iOS के लिए डायनेमिक लाइब्रेरी प्रोजेक्ट बनाने की अनुमति देने के खिलाफ डिफ़ॉल्ट प्रतिबंध Xcode में कुछ है जिसे आप कुछ XCode xml फ़ाइलों को संपादित करके ओवरराइड करने की क्षमता रखते हैं:

IOS पर dylib का निर्माण और उपयोग करें

एक बार ऐसा करने के बाद, आप एक सामान्य iOS .dylib लाइब्रेरी का निर्माण कर सकते हैं , और ऊपर दिए गए नमूना कोड के अनुसार इसका उपयोग कर सकते हैं। (हां, जब भी आप एक नया XCode संस्करण स्थापित करते हैं, तो आपको संभवतः इस क्षमता को फिर से अनलॉक करना होगा)।

तो, यह एक तकनीकी सीमा नहीं है, बल्कि एक ऐप स्टोर नीति सीमा है। यदि आप ऐप स्टोर तक सीमित नहीं हैं, तो आप इसे कर सकते हैं। ध्यान दें कि इस तकनीक को जेलब्रेकिंग की आवश्यकता नहीं है, हालांकि यदि ऐप सैंडबॉक्स है, तो यह सीमित हो सकता है जहां से dylibs लोड किया जा सकता है।

संपादित करें: यह सुनिश्चित करने के लिए कि यह जानकारी भविष्य के लिंक सड़ांध से नहीं खोई गई है, यहां मैं उस लिंक की सामग्री है जो मैंने प्रदान की है कि कैसे Xcode में iOS dylibs को सक्षम किया जाए। ( नोट: यह प्रक्रिया अभी भी Xcode 4 पर काम करती है, लेकिन पाथ, आदि के अपडेट के लिए नीचे टिप्पणी (ओं) को देखें) स्रोत iOS प्लेस ब्लॉग है :


Xcode आपको iOS के लिए dylib बनाने की अनुमति नहीं देता है। यदि यह एकल बाइनरी नहीं है तो ऐप को अस्वीकार कर दिया जाएगा। लेकिन मेरे पास एक एप्लिकेशन है जिसमें वैकल्पिक मॉड्यूल लोड करने के लिए प्लग-इन आर्किटेक्चर है। मैं बस यह चाहता हूं कि आईओएस को पूरी तरह से पोर्ट करने से पहले कॉन्सेप्ट साबित करने के लिए एक क्विक प्रोटोटाइप चाहिए। यह तेजी से अगर dylib बस काम कर सकता है। तो, इस पोस्ट से पता चलता है कि कैसे dylib का निर्माण और उपयोग किया जाता है लेकिन ध्यान रखें कि यह App Store को अनुमोदित नहीं किया जाएगा। (10.6.4 पर Xcode 3.2.4 के साथ परीक्षण किया गया)

1. ओपन संपत्ति सूची संपादक में इन फ़ाइलों: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX उत्पाद Types.xcspec और /Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications / iPhone सिम्युलेटर ProductTypes.xcspec

2. " MacOSX उत्पाद प्रकार .xcspec " में उत्पाद का पता लगाएँ, जिसमें उत्पाद का प्रकार है com.apple.product-type.library.dynamicऔर इसे " iPhone सिम्युलेटर ProductTypes.xcspec " पर खींचें ।

Xcode स्क्रीनशॉट 1

3. खोलें " MacOSX पैकेज Types.xcspec " और " iPhone सिम्युलेटर PackageTypes.xcspec " समान स्थानों पर पाए गए।

4. आइटम को " MacOSX उत्पाद प्रकारों .xcspec " में खोजें, जिसमें पैकेज प्रकार है com.apple.package-type.mach-o-dylibऔर इसे " iPhone सिम्युलेटर PackageTypes.xcspec " पर खींचें ।

Xcode स्क्रीनशॉट 2

5. " iPhoneOS.platform " के लिए चरणों को दोहराएं और अगर यह चल रहा था तो Xcode पुनः लोड करें।

अब, एक dylib बनाने की सुविधा देता है। " कोको टच स्टेटिक लाइब्रेरी " टेम्पलेट के साथ शुरू करें । इस परियोजना में Foundation.framework शामिल होना चाहिए। यहां मैं परिवर्तन कर रहा हूं जो dylib बनाने के लिए टेम्पलेट के शीर्ष पर किया गया है।

1. एक पाठ संपादक में फ़ाइल project.pbxproj (Xcode प्रोजेक्ट फ़ाइल बंडल के अंदर पाया गया) खोलें । स्ट्रिंग " Producttype " के लिए खोजें , इसे मान में बदलें com.apple.product-type.library.dynamic;

अब, Xcode के साथ प्रोजेक्ट खोलें, प्रोजेक्ट पर जाएं-> प्रोजेक्ट सेटिंग्स संपादित करें

2. " इंस्टॉलेशन डायरेक्ट्री " सेट है @executable_path/क्योंकि मैं ऐप के एक्जीक्यूटेबल के समान डाइलिब को उसी डायरेक्टरी में रखने की योजना बना रहा हूं।

3. " माईन-ओ टाइप " डायनामिक लाइब्रेरी के लिए सेट

4. " निष्पादन एक्सटेंशन " सेट dylib के लिए

5. " निष्पादन योग्य उपसर्ग " खाली करने के लिए सेट

6. पुस्तकालय में एक या दो सरल विधियों को जोड़ें और इसका निर्माण करें।

अब, इसका परीक्षण करने के लिए एक ऐप बनाएं। इस बार, मैं दृश्य-आधारित अनुप्रयोग चुनूँ । लिब को कॉल करने और रिटर्न संदेश दिखाने के लिए एक UIButton और एक UILabel को हुक करें। आप पूरी परियोजना TestApp डाउनलोड कर सकते हैं और इसके साथ खेल सकते हैं।


2
XCode 4.5 के रूप में, इन फ़ाइलों को (जैसे।) /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications पर देखा जा सकता है
क्रिस Devereux

@ क्रिसडीवेरक्स, धन्यवाद! मैंने अप-टू-डेट रास्तों के लिए आपकी टिप्पणी की जांच करने के लिए एक नोट डाला ... जो निश्चित रूप से, भविष्य के संस्करण में फिर से बदल सकता है :)
नैट

3
इस उत्तर को और अधिक बढ़ाने की आवश्यकता है (और वास्तव में स्वीकृत उत्तर होना चाहिए, लेकिन मुझे संदेह है कि उपयोगकर्ता 510951 2 साल के लिए एसओ से दूर रहने के बाद वापस आ जाएगा)। बहुत अच्छा जवाब नैट!
chown

1
किसी प्रकार का मास्टर ओवरराइड होना चाहिए जहां अगर @chown कहता है कि एक उत्तर सही है ... यह बहुत अच्छा है।
टिम

@Panagiotis, कृपया एक नया प्रश्न पोस्ट करें, ताकि इसे ठीक से संबोधित किया जा सके। आपके द्वारा उपयोग किए जा रहे कोड और सभी त्रुटि संदेशों को दिखाएं। यदि आप चाहें, तो आप इस प्रश्न / उत्तर पर वापस भी लिंक कर सकते हैं । यदि आप "iphone-privateapi" टैग जोड़ते हैं, तो मैं इसे देखूंगा। आपको यह बताना चाहिए कि यह ऐप स्टोर के लिए नहीं है, या लोग प्रश्न को बंद करने के लिए वोट कर सकते हैं।
नैट

0

Xcode 11.4.1 डायनेमिक लाइब्रेरी से शुरू करने की अनुमति नहीं है (आपकी परियोजना सभी गंतव्यों के लिए संकलन नहीं करेगी)। Libs / चौखटे का उपयोग करने का नया तरीका है xcodebuild से xcframework बनाना।

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