Xamarin.iOS
बाइंडिंग स्विफ्ट लाइब्रेरी
खोज…
परिचय
एक गाइड का पालन करना आसान है जो आपको ज़ैमरिन प्रोजेक्ट में उपयोग के लिए स्विफ्ट .framework फ़ाइलों को बाइंड करने की प्रक्रिया के माध्यम से ले जाएगा।
टिप्पणियों
Xcode में लाइब्रेरी बनाते समय इसमें स्विफ्ट लाइब्रेरी शामिल करने का विकल्प होता है। नहीं करें! उन्हें आपके अंतिम ऐप में NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib के रूप में शामिल किया जाएगा, लेकिन उन्हें NAME.app/Frameworks/libswift*.dylib के रूप में शामिल किया जाना चाहिए
आप यह जानकारी कहीं और पा सकते हैं, लेकिन यह ध्यान देने योग्य है: लाइब्रेरी में बिटकोड को शामिल न करें। अभी तक Xamarin में iOS के लिए Bitcode शामिल नहीं है और Apple को समान आर्किटेक्चर का समर्थन करने के लिए सभी पुस्तकालयों की आवश्यकता है।
Xamarin.iOS में एक स्विफ्ट लाइब्रेरी को बांधना
Xamarin.iOS में एक स्विफ्ट लाइब्रेरी को बांधना Objective-C के लिए उसी प्रक्रिया का अनुसरण करता है जैसा कि https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/ में दिखाया गया है, लेकिन कुछ कैविटीज़ के साथ।
- एक स्विफ्ट क्लास को NSObject से बांधा जाना चाहिए।
- स्विफ्ट कंपाइलर वर्ग और प्रोटोकॉल नामों को किसी और चीज़ में तब तक अनुवादित करेगा जब तक कि आप स्पष्ट उद्देश्य c नाम निर्दिष्ट करने के लिए अपने स्विफ्ट क्लासेस में @objc एनोटेशन (जैसे @objc (MyClass)) का उपयोग न करें।
- रनटाइम में आपके APP में आपके बाइंड किए गए फ्रेमवर्क के साथ कुछ स्विफ्ट कोर लाइब्रेरीज़ शामिल होनी चाहिए, जिन्हें फ्रेमवर्क कहा जाता है;
- जब App को AppStore में धकेला जाता है, तो इसमें आपके पेलोड फ़ोल्डर के साथ एक SwiftSupport फ़ोल्डर शामिल होना चाहिए। वे IPA फ़ाइल के अंदर हैं।
यहां आप एक साधारण नमूना बाइंडिंग पा सकते हैं: https://github.com/Flash3001/Xamarin.BindingSwift.com
और एक पूर्ण बाध्यकारी नमूना: https://github.com/Flash3001/iOSCharts.Xamarin
कृपया नीचे चरण खोजें:
1.1 उन स्विफ्ट कक्षाओं को तैयार करें जिन्हें आप निर्यात करना चाहते हैं
आप जिस भी स्विफ्ट क्लास का उपयोग करना चाहते हैं, उसके लिए आपको या तो NSObject से वारिस होना है और ऑब्जेक्टिव-सी नाम को ओब्जेक्ट एनोटेशन का उपयोग करके स्पष्ट करना है। अन्यथा स्विफ्ट कंपाइलर विभिन्न नाम उत्पन्न करेगा। नीचे एक उदाहरण कोड है कि स्विफ्ट वर्ग कैसा दिख सकता है। ध्यान दें कि यह कोई फर्क नहीं पड़ता कि यह कौन सा वर्ग विरासत में मिला है जब तक कि मूल वर्ग NSObject से विरासत में मिला है।
//Add this to specify explicit objective c name
@objc(MyClass)
open class MyClass: NSObject {
open func getValue() -> String
{
return "Value came from MyClass.swift!";
}
}
1.2 ढांचे का निर्माण
बिटकोड को अक्षम करें। *
डिवाइस और सिम्युलेटर के लिए रिलीज़ के लिए बनाएँ। *
- केवल स्विफ्ट बाइंडिंग से संबंधित नहीं है।
2. एक मोटी लाइब्रेरी बनाएं
एक फ्रेमवर्क में कई फाइलें होती हैं, जिसे थोड़ा खाने की जरूरत होती है वह है NAME.framework / NAME (बिना विस्तार के)।
- कॉपी रिलीज़- iphoneos / NAME.framework करने के लिए NAME.framework
- उपयोग करके FAT लाइब्रेरी बनाएं:
- लिपो-क्रिएट रिलीज़-आईफ़ोनह्युलेटर / NAME.framework / NAME रिलीज़-iphoneos / NAME.framework / NAME -output NAME.framework / NAME
- रिलीज़- iphonesimulator / NAME.framework / Modules / NAME.swiftmodule में NAME.framework / Modules / NAME.swiftmodule (अब तक केवल iphoneos से फ़ाइलें सम्मिलित करें) में फ़ाइलों की प्रतिलिपि बनाएँ
3. पुस्तकालय आयात करें
मुझे लगता है कि आप पहले से ही फ़ाइल -> नई -> iOS -> बाइंडिंग लाइब्रेरी में बाइंडिंग प्रोजेक्ट बना चुके हैं।
Xamarin समर्थन आयात करता है। बस 'मूल संदर्भ' पर राइट क्लिक करें और 'मूल संदर्भ जोड़ें' पर क्लिक करें। नव निर्मित वसा ढांचे को ढूंढें और इसे जोड़ें।
4. हेडर के अंदर LIBRARY-Swift.h फाइल के आधार पर ApiDefinition बनाएं।
आप इसे मैन्युअल रूप से कर सकते हैं, लेकिन यह अच्छा नहीं होगा। आप Objetive Sharpie का उपयोग कर सकते हैं। Xamarin उपकरण अपने स्वयं के पुस्तकालयों को बांधने के लिए उपयोग करता है।
Https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/ पर इसका उपयोग कैसे करें
मूल कमांड कुछ इस तरह होगी: शार्प बाइंड -sdk iphoneos9.3 NAME-Swift.h
यदि आपको एक System.Reflection.TargetInvocationException
मिलता है, तो यह संभवतः इसलिए है क्योंकि आपके पास एक अलग एसडीके संस्करण स्थापित है। आपके द्वारा स्थापित iPhone OS SDK के साथ जांच करने के लिए निम्नलिखित कमांड चलाएँ:
sharpie xcode -sdks
NAME-Swift.h फ़ाइल NAME.framework / Headers / NAME-Swift.h में स्थित है
नोट: स्विफ्ट वर्गों को "NSObject" से विरासत में प्राप्त होना चाहिए, अन्यथा NAME-Swift.h आपकी कक्षाएं आयात नहीं करेगा और Objetive Sharpie कुछ भी नहीं बदलेगा।
अपने बाइंडिंग प्रोजेक्ट ApiDefinition.cs की सामग्री को नए बनाए गए के साथ बदलें।
5. ऑब्जेक्टिव-सी रनटाइम में वर्ग के नाम को शामिल करने के लिए सभी [प्रोटोकॉल] और [बेसटाइप] को बदलें।
यदि मूल स्विफ्ट वर्ग या प्रोटोकॉल में चरण १.१ में निर्दिष्ट @objc (MyClass) एनोटेशन शामिल नहीं है, तो उनके आंतरिक उद्देश्य-सी नाम बदल जाएंगे, इसलिए आपको इसे दाईं ओर मैप करने की आवश्यकता है।
सभी नाम NAME-Swift.h फ़ाइल में निम्न प्रारूप में उपलब्ध हैं:
SWIFT_CLASS("_TtC11SwiftSample7MyClass")
@interface MyClass : NSObject
तथा
SWIFT_PROTOCOL("_TtP6Charts17ChartDataProvider_")
@protocol ChartDataProvider
नाम आप उपयोग सेट करने के लिए BaseTypeAttribute.Name https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#BaseType.Name कक्षाओं के लिए संपत्ति और ProcotolAttribute.Name https: // developer.xamarin.com/api/property/MonoTouch.Foundation.ProtocolAttribute.Name/ प्रोटोकॉल के लिए।
[BaseType(typeof(NSObject), Name = "_TtC11SwiftSample7MyClass")]
interface MyClass
इसे मैन्युअल रूप से करना अच्छा नहीं है। सभी नामों को सम्मिलित करने के लिए आप इस टूल https://github.com/Flash3001/SwiftClassify का उपयोग कर सकते हैं। (यह प्रगति पर काम कर रहा है। लेकिन यह काफी सरल है, बस कोड को देखकर आपको पता चलेगा कि यह कैसे काम करता है)।
6.1 सभी स्विफ्ट निर्भरता को चलाने के लिए शामिल करें।
यदि आप किसी ऐप में लाइब्रेरी का उपभोग करने की कोशिश करते हैं और इसे अभी चलाने की कोशिश करते हैं तो यह दुर्घटनाग्रस्त हो जाएगा। त्रुटि libswiftCore.dylib की कमी के कारण है
कुछ इस तरह:
Dyld Error Message:
Library not loaded: @rpath/libswiftCore.dylib
Referenced from: /Users/USER/Library/Developer/CoreSimulator/Devices/AC440891-C819-4050-8CAB-CE15AB4B3830/data/Containers/Bundle/Application/27D2EC87-5042-4FA7-9B80-A24A8971FB48/SampleUsing.app/Frameworks/SwiftSample.framework/SwiftSample
Reason: image not found
Xamarin.iOS एक स्विफ्ट लाइब्रेरी को बाध्य करने के लिए आधिकारिक समर्थन नहीं देता है। तो आपको मैन्युअल रूप से स्विफ्ट कोर लाइब्रेरी को फ्रेमवर्क और स्विफ्टसुपोर्ट फोल्डर में शामिल करना होगा। सिम्युलेटर और डिवाइस के लिए फ्रेमवर्क फ़ोल्डर की फाइलें अलग-अलग हैं। उन्हें /Applications/Xcode.app/Contents/Developer//XcodeDefault.xctoolchain/usr/lib/swift.Toolchains में पाया जा सकता है
फ़्रेमवर्क फ़ोल्डर के अंदर फ़ाइलों को मैन्युअल रूप से कॉपी करने के बजाय आप इस लाइब्रेरी https://github.com/Flash3001/Xamarin.Swift3.Support का उपयोग कर सकते हैं। इसमें हर एक निर्भरता स्विफ्ट 3.1 ज़रूरतें शामिल हैं, प्रत्येक एक एकल NuGet पैकेज में।
जैसा कि आप देख सकते हैं, उपभोक्ता पैकेज में Nuget पैकेज शामिल है, न कि केवल बंधन में। यदि आप इसे बाध्यकारी में शामिल करने का प्रयास करते हैं तो आपको संकलन त्रुटियां मिलेंगी।
यदि आप एक Nuget पैकेज बना रहे हैं तो आप Nuget को एक निर्भरता के रूप में शामिल करने का निर्देश दे सकते हैं।
6.2। यह पता लगाना कि कौन सी स्विफ्ट निर्भरता में शामिल हैं।
एक महत्वपूर्ण बात यह है कि आपको अपनी परियोजना में शामिल प्रत्येक पैकेज का पता लगाना है। एक साधारण बंधन की आमतौर पर आवश्यकता होगी:
libswiftCore.dylib
libswiftCoreGraphics.dylib
libswiftCoreImage.dylib
libswiftDarwin.dylib
libswiftDispatch.dylib
libswiftFoundation.dylib
libswiftObjectiveC.dylib
libswiftQuartzCore.dylib
libswiftUIKit.dylib
प्रत्येक निर्भरता को सूचीबद्ध करने के लिए आप अपने LibraryName.framework के अंदर निम्न कमांड चला सकते हैं
otool -l -arch armv7 LibraryName | grep libswift
Swift3 के लिए NuGet में उपलब्ध प्रत्येक पैकेज को शामिल न करें क्योंकि वे आपके ऐप का आकार बढ़ा सकते हैं।
App को AppStore में धकेलने के लिए SwiftSupport शामिल करें।
Apple को आपके ऐप को आपके पेलोड फ़ोल्डर के साथ SwiftSupport फ़ोल्डर के साथ भेजने की आवश्यकता है। दोनों आपके IPA पैकेज के अंदर हैं।
आपके लिए यह काम करने के लिए आप इस स्क्रिप्ट https://github.com/bq/ipa-packager का उपयोग कर सकते हैं।
यह प्रक्रिया केवल एक पुस्तकालय उपभोक्ता को मैन्युअल रूप से करनी होगी। हर बार वह ऐप को ऐपस्टोर पर धकेलने की कोशिश करता है।
'साइन और डिस्ट्रिब्यूट' पर क्लिक करें और डिस्क पर सेव करें
उल्लेख से पहले स्क्रिप्ट का उपयोग करके नया आईपीए बनाएं
यदि आप फ़ाइल को अनज़िप करते हैं, तो इसमें SwiftSupport फ़ोल्डर होगा।
टिप्पणियों
Xcode में लाइब्रेरी बनाते समय इसमें स्विफ्ट लाइब्रेरी शामिल करने का विकल्प होता है। नहीं करें! उन्हें आपके अंतिम ऐप में NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib के रूप में शामिल किया जाएगा, लेकिन उन्हें NAME.app/Frameworks/libswift*.dylib के रूप में शामिल किया जाना चाहिए
आप यह जानकारी कहीं और पा सकते हैं, लेकिन यह ध्यान देने योग्य है: लाइब्रेरी में बिटकोड को शामिल न करें। अभी तक Xamarin में iOS के लिए Bitcode शामिल नहीं है और Apple को समान आर्किटेक्चर का समर्थन करने के लिए सभी पुस्तकालयों की आवश्यकता है।
अस्वीकरण
यह गाइड मूल रूप से लुकास टेक्सेरा द्वारा बनाया गया है। सारा श्रेय उसी का है। धन्यवाद, लुकास।