दिलचस्प पोस्ट
जावास्क्रिप्ट में JSON पार्स करें? पायथन में वर्ण के ASCII मान कैसे तय करने के लिए "आपका रुबी संस्करण 1.9.3 है, लेकिन आपके Gemfile निर्दिष्ट 2.0.0" पीडीओ त्रुटि: "SQLSTATE : सामान्य त्रुटि" डेटाबेस अद्यतन करते समय PHP फ़्रेमवर्क का उपयोग करें या नहीं? एनजीएफएर एंज्यूलर 2 में पाइप के साथ डेटा अपडेट नहीं करता है JPQL कन्स्ट्रक्टर एक्सप्रेशन – org.hibernate.hql.ast.QuerySyntaxException: तालिका मैप नहीं है कॉम्बो बॉक्स चयनितआइटम बनाम बना दिया वैल्यू एक्सएमएल स्किमा मिन ओककर्स / मैक्स ओकेर्स डिफ़ॉल्ट मान स्विफ्ट 2.2 में सी-स्टाइल लूप के लिए रिप्लेसमेंट कमांड लाइन से माइक्रोसॉफ्ट एज में यूआरएल कैसे खोलें? बिना किसी अपवाद को संभालना और लॉग फ़ाइल भेजने की आवश्यकता है SQLite में AUTOINCREMENT के लिए प्रारंभ मूल्य सेट करें Git.exe कहां स्थित है? मैं पायथन में Excel प्रारूप में एक तिथि कैसे पढ़ूं?

एक स्विफ्ट फ़्रेमवर्क में कॉमन क्रिप्टो को आयात करना

आईओएस के लिए स्विफ्ट फ़्रेमवर्क में आप कॉमन क्राईप्टो कैसे आयात करते हैं?

मैं समझता हूं कि स्विफ्ट ऐप में कॉमनक्रीप्टो का उपयोग कैसे करें: आप ब्रिजिंग हेडर में #import <CommonCrypto/CommonCrypto.h> जोड़ें

हालांकि, स्विफ्ट फ़्रेमवर्क ब्रिजिंग हेडर का समर्थन नहीं करते हैं। प्रलेखन कहते हैं:

आप बाहरी ढांचे को आयात कर सकते हैं जिनमें शुद्ध उद्देश्य-सी कोडबेस, शुद्ध स्विफ्ट कोडबेस, या मिश्रित-भाषा कोडबेस है। एक बाहरी ढांचे को आयात करने की प्रक्रिया एक समान है कि क्या ढांचे को एक ही भाषा में लिखा गया है या दोनों भाषाओं की फ़ाइलें शामिल हैं जब आप बाहरी ढांचे को आयात करते हैं, तो सुनिश्चित करें कि आपके द्वारा आयात किए जा रहे ढांचे के लिए निर्धारित मॉड्यूल बिल्ड सेटिंग हाँ पर सेट की गई है

आप निम्न सिंटैक्स का उपयोग करके एक अलग लक्ष्य के भीतर किसी भी स्विफ्ट फ़ाइल में एक फ्रेमवर्क आयात कर सकते हैं:

 import FrameworkName 

दुर्भाग्य से, आयात करें CommonCrypto काम नहीं करता है न तो छत्र शीर्षक के लिए #import <CommonCrypto/CommonCrypto.h> है।

वेब के समाधान से एकत्रित समाधान "एक स्विफ्ट फ़्रेमवर्क में कॉमन क्रिप्टो को आयात करना"

आप वास्तव में ऐसे समाधान का निर्माण कर सकते हैं जो "बस काम करता है" (अन्य प्रोजेक्ट पर मॉड्यूल.मॉडलैप और SWIFT_INCLUDE_PATHS सेटिंग की प्रतिलिपि बनाने की आवश्यकता नहीं है, जैसा कि यहां अन्य समाधानों की आवश्यकता है), लेकिन आपको डमी फ्रेमवर्क / मॉड्यूल बनाने की आवश्यकता है आपके ढांचे में उचित आयात करेंगे हम यह भी सुनिश्चित कर सकते हैं कि यह प्लेटफ़ॉर्म की परवाह किए बिना काम करता है ( iphoneos , iphonesimulator , या iphonesimulator )

  1. अपनी प्रोजेक्ट में एक नया ढांचा लक्ष्य जोड़ें और इसे सिस्टम लाइब्रेरी के बाद नाम दें, जैसे "कॉमनक्रिप्टो" (आप छाता हेडर, कॉमनक्रीप्टो एच हटा सकते हैं।)

  2. एक नई कॉन्फ़िगरेशन सेटिंग्स फ़ाइल जोड़ें और उसे नाम दें, उदाहरण के लिए , "CommonCrypto.xcconfig" (शामिल करने के लिए अपने किसी भी लक्ष्य को न देखें।) इसे निम्नलिखित के साथ जमा करें:

     MODULEMAP_FILE[sdk=iphoneos*] = \ $(SRCROOT)/CommonCrypto/iphoneos.modulemap MODULEMAP_FILE[sdk=iphonesimulator*] = \ $(SRCROOT)/CommonCrypto/iphonesimulator.modulemap MODULEMAP_FILE[sdk=macosx*] = \ $(SRCROOT)/CommonCrypto/macosx.modulemap 
  3. उपर्युक्त तीन संदर्भित मॉड्यूल मैप फाइल बनाएं, और निम्नलिखित के साथ उन्हें पॉप्युलेट करें:

    • iphoneos.modulemap

       module CommonCrypto [system] { header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h" export * } 
    • iphonesimulator.modulemap

       module CommonCrypto [system] { header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/CommonCrypto/CommonCrypto.h" export * } 
    • macosx.modulemap

       module CommonCrypto [system] { header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/CommonCrypto/CommonCrypto.h" export * } 

    ("Xcode- beta.app" के साथ "Xcode.app" को बदलें यदि आप बीटा संस्करण चला रहे हैं। 10.11 को अपने वर्तमान ओएस एसडीके के साथ बदलें यदि एल कैप्टन नहीं चल रहा है।)

  4. अपनी प्रोजेक्ट सेटिंग्स के सूचना टैब पर, कॉन्फ़िगरेशन के तहत, CommonCrypto के डीबग और रिलीज कॉन्फ़िगरेशन को सेट करें CommonCrypto ( CommonCrypto.xcconfig का संदर्भ दे रहा है )

  5. आपके फ्रेमवर्क लक्ष्य के बिल्ट चरणों टैब पर, निर्भरता को लक्षित करने के लिए CommonCrypto ढांचा जोड़ें। इसके साथ ही libcommonCrypto.dylib को जोड़ने के लिए लिंक बाइनरी पुस्तकालयों के साथ चरण निर्माण।

  6. उत्पादों में CommonCrypto.framework का चयन करें और सुनिश्चित करें कि आपके रैपर के लिए लक्ष्य की सदस्यता को वैकल्पिक पर सेट किया गया है।

अब आप अपने आवरण फ्रेमवर्क में import CommonCrypto का निर्माण, चलाने और import CommonCrypto करने में सक्षम होंगे।

उदाहरण के लिए, देखें कि कैसे SQLite.swift एक डमी sqlite3.framework का उपयोग करता है

मुझे एक गीथहब प्रोजेक्ट मिला है जो सफलतापूर्वक एक स्विफ्ट फ्रेमवर्क में कॉमनक्रीप्टो का उपयोग करता है: SHA256-swift इसके अलावा, sqlite3 के साथ एक ही समस्या के बारे में यह लेख उपयोगी था।

उपर्युक्त के आधार पर, ये चरण हैं:

1) परियोजना निर्देशिका के अंदर एक CommonCrypto निर्देशिका बनाएँ। भीतर, एक module.map फ़ाइल बनाएं। मॉड्यूल मानचित्र हमें स्विफ्ट के भीतर एक मॉड्यूल के रूप में कॉमनक्रीप्टो लाइब्रेरी का उपयोग करने की अनुमति देगा। इसकी सामग्री हैं:

 module CommonCrypto [system] { header "/Applications/Xcode6-Beta5.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/usr/include/CommonCrypto/CommonCrypto.h" link "CommonCrypto" export * } 

2) बिल्ड सेटिंग्स में, स्विफ्ट कम्पाइलर के भीतर – खोज पथ , आयात पथ ( SWIFT_INCLUDE_PATHS ) के लिए CommonCrypto निर्देशिका जोड़ें।

बिल्डिंग सेटिंग

3) अंत में, अपने स्विफ्ट फ़ाइलों के भीतर कॉमनक्रीप्टो को किसी भी अन्य मॉड्यूल के रूप में आयात करें। उदाहरण के लिए:

 import CommonCrypto extension String { func hnk_MD5String() -> String { if let data = self.dataUsingEncoding(NSUTF8StringEncoding) { let result = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH)) let resultBytes = UnsafeMutablePointer<CUnsignedChar>(result.mutableBytes) CC_MD5(data.bytes, CC_LONG(data.length), resultBytes) let resultEnumerator = UnsafeBufferPointer<CUnsignedChar>(start: resultBytes, length: result.length) let MD5 = NSMutableString() for c in resultEnumerator { MD5.appendFormat("%02x", c) } return MD5 } return "" } } 

सीमाएं

किसी अन्य प्रोजेक्ट में कस्टम फ़्रेमवर्क का उपयोग करना missing required module 'CommonCrypto' कारण त्रुटि के साथ समय संकलन में विफल रहता है इसका कारण यह है कि कस्टम फ्रेमवर्क के साथ CommonCrypto मॉड्यूल को शामिल नहीं किया गया है। एक कार्यवाही यह है कि ढांचे का उपयोग करने वाले प्रोजेक्ट में चरण 2 ( Import Paths सेट करना) दोहराएं

मॉड्यूल नक्शा स्वतंत्र नहीं है (यह वर्तमान में किसी विशिष्ट प्लेटफॉर्म, आईओएस 8 सिम्युलेटर के लिए इंगित करता है)। मुझे पता नहीं है कि वर्तमान प्लेटफॉर्म के मुताबिक हैडर पथ कैसे बना सकता है।

आईओएस 8 के लिए अपडेट्स <= हमें सफल संकलन प्राप्त करने के लिए लाइन लिंक "कॉमनक्रीप्टो" को निकालना चाहिए।

संपादित करें

मुझे मिल रहा है

ld: -lcommoncrypto के लिए वास्तुकला x86_64 क्लैग के लिए नहीं मिला पुस्तकालय: त्रुटि: लिंकर कमांड विफलता कोड 1 के साथ विफल (उपयोग -V अभिविन्यास देखने के लिए)

जब तक मैं link "CommonCrypto" हटा नहीं link "CommonCrypto" एक बार जब मैंने इसे हटा दिया तो ठीक से बनाया गया था।

कुछ सरल और अधिक मजबूत मॉड्यूल नक्शा स्वचालित रूप से और सही Xcode / SDK पथ के साथ उत्पन्न करने के लिए रन स्क्रिप्ट चरण के साथ "सामान्यक्रिप्टो मॉड्यूल मैप" नामक एक समग्र लक्ष्य बनाने के लिए है:

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

रन स्क्रिप्ट चरण में यह बाश शामिल होना चाहिए:

 # This if-statement means we'll only run the main script if the CommonCryptoModuleMap directory doesn't exist # Because otherwise the rest of the script causes a full recompile for anything where CommonCrypto is a dependency # Do a "Clean Build Folder" to remove this directory and trigger the rest of the script to run if [ -d "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap" ]; then echo "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap directory already exists, so skipping the rest of the script." exit 0 fi mkdir -p "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap" cat <<EOF > "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap/module.modulemap" module CommonCrypto [system] { header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h" export * } EOF 

शेल कोड और ${SDKROOT} का उपयोग करने का अर्थ है कि आपको कठिन कोड Xcode.app पथ नहीं है, जो सिस्टम-टू-सिस्टम को बदल सकता है, खासकर यदि आप बीटा संस्करण पर स्विच करने के लिए एक्सोड xcode-select का उपयोग करते हैं, या सीआई सर्वर जहां कई संस्करण गैर-मानक स्थानों में स्थापित किए गए हैं। आपको भी हार्ड कोड एसडीके की आवश्यकता नहीं है, इसलिए यह आईओएस, मैकोज़ आदि के लिए काम करना चाहिए। आपको अपने प्रोजेक्ट की स्रोत निर्देशिका में कुछ भी बैठने की आवश्यकता नहीं है।

इस लक्ष्य को बनाने के बाद, अपनी लाइब्रेरी / फ्रेमवर्क लक्ष्य निर्भरता वाले आइटम पर निर्भर करते हैं:

यहां छवि विवरण दर्ज करें

यह सुनिश्चित करेगा कि आपके ढांचे का निर्माण होने से पहले मॉड्यूल मैप तैयार हो गया है।

मैकोज नोट : यदि आप macOS समर्थन कर रहे हैं, तो आपको अभी बनाया नया सकल लक्ष्य पर Supported Platforms निर्माण की स्थापना के लिए macosx को जोड़ने की आवश्यकता होगी, अन्यथा यह मॉड्यूल मैप सही Debug व्युत्पन्न डेटा फ़ोल्डर में नहीं डाल पाएगा बाकी ढांचे के उत्पादों के साथ

यहां छवि विवरण दर्ज करें

इसके बाद, "हैडर खोज पथ" ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap सेटिंग के लिए मॉड्यूल नक्शे की मूल निर्देशिका, ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap :

यहां छवि विवरण दर्ज करें

यदि आपके पास परियोजना या xcconfig स्तर पर निर्धारित खोज पथ हैं, तो $(inherited) पंक्ति को जोड़ना याद रखें

यही है, अब आप import CommonCrypto को import CommonCrypto करने में सक्षम import CommonCrypto

यह उत्तर चर्चा करता है कि यह कैसे एक ढांचे के अंदर काम करता है, और कोकोपोड्स और कार्थेज के साथ

🐟 म्यूडलेमैप दृष्टिकोण

मैं modulemap Crypto https://github.com/onmyway133/arcane के आसपास मेरे आवरण में modulemap का उपयोग modulemap हूँ, https://github.com/onmyway133/Reindeer

उन header not found प्राप्त करने वाले के लिए, कृपया https://github.com/onmyway133/Arcane/issues/4 पर नज़र डालें या xcode-select --install चलाएं

  • एक फ़ोल्डर CCommonCrypto बनाने के साथ CCommonCrypto module.modulemap

      module CCommonCrypto { header "/usr/include/CommonCrypto/CommonCrypto.h" export * } 
  • निर्मित सेटिंग्स पर जाएं -> आयात पथ

      ${SRCROOT}/Sources/CCommonCrypto 

With मोडोलेमैप दृष्टिकोण के साथ कोकोपॉड

🐘 सार्वजनिक शीर्ष लेख दृष्टिकोण

  • जी के आसपास एक आवरण है, और यह सार्वजनिक हैडर दृष्टिकोण का उपयोग करता है

  • इसमें एक हेडर फाइल है जिसका Target Membership https://github.com/honghaoz/Ji/blob/master/Source/Ji.h साथ Target Membership Public

  • इसमें लिबक्समल 2 के लिए हेडर फाइलों की एक सूची है https://github.com/honghaoz/Ji/tree/master/Source/Ji-libxml

  • इसमें बिल्ड सेटिंग -> हैडर खोज पथ हैं

      $(SDKROOT)/usr/include/libxml2 
  • इसमें बिल्ड सेटिंग -> अन्य लिंकर फ्लैग है

      -lxml2 

सार्वजनिक हेडर दृष्टिकोण के साथ कोकोपॉड

🐝 दिलचस्प संबंधित पोस्ट

मॉडेलेमैप समाधान अच्छा हो सकते हैं, और एसडीके परिवर्तनों के खिलाफ मजबूत हो सकते हैं, लेकिन मैंने अभ्यास में उपयोग करने के लिए उन्हें अजीब पाया है, और जितना विश्वसनीय नहीं है उतना विश्वसनीय होना चाहिए जब मैं चीजों को अन्य लोगों को सौंपेगा इसे और अधिक आसान बनाने की कोशिश करने के लिए, मैं एक अलग तरीका चला गया:

सिर्फ हेडर कॉपी करें

मुझे पता है, नाजुक लेकिन ऐप्पल लगभग कभी भी कॉमनक्रिप्टो में महत्वपूर्ण बदलाव नहीं करता है और मैं सपना रह रहा हूं कि वे किसी भी महत्वपूर्ण तरीके से इसे बिना किसी भी तरह से बदल देंगे, अंत में कॉमनक्रीप्टो को एक मॉड्यूलर हेडर बनाया होगा।

"शीर्षकों की प्रतिलिपि बनाएँ" मेरा मतलब है कि "प्रीप्रोसेसर की तरह आपके प्रोजेक्ट में एक विशाल शीर्षलेख की आवश्यकता वाले सभी हेडर को कट और पेस्ट करें।" इसका एक उदाहरण के रूप में आप प्रतिलिपि या अनुकूल कर सकते हैं, देखें RNCryptor.h ।

ध्यान दें कि इन सभी फ़ाइलों को एपीएसएल 2.0 के तहत लाइसेंस प्राप्त है, और यह दृष्टिकोण जानबूझकर कॉपीराइट और लाइसेंस नोटिस रखता है। मेरा कंसैटनेशन चरण एमआईटी के अंतर्गत लाइसेंस प्राप्त है, और यह केवल अगले लाइसेंस नोटिस तक लागू होता है)।

मैं यह नहीं कह रहा हूं कि यह एक सुंदर समाधान है, लेकिन अभी तक इसे लागू करने और समर्थन दोनों के लिए एक अविश्वसनीय रूप से आसान समाधान होता है।

@ मॉोगस्टाड एक कोकोपॉड में @stephencelis समाधान को लपेटने के लिए काफी अच्छा है:

पॉड 'libCommonCrypto'

उपलब्ध अन्य फली मेरे लिए काम नहीं किया

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

 pod 'CommonCryptoModule', '~> 1.0.2' 

उसके बाद, आपको केवल उन मॉड्यूल को आयात करना है जहां आपको CommonCrypto जरूरत है, जैसे:

 import CommonCryptoModule 

आशा है कि किसी और को यह उपयोगी पाता है

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

स्विफ्ट प्रोजेक्ट में, ऑब्जेक्टिव-सी ब्रिजिंग हेडर बनाएं, उद्देश्य-सी में एनएसडीटा श्रेणी (या लाइब्रेरी का उपयोग करने के लिए कस्टम क्लास) बनाएं। केवल दोष यह होगा कि आपको उद्देश्य-सी में सभी कार्यान्वयन कोड लिखना होगा। उदाहरण के लिए:

 #import "NSData+NSDataEncryptionExtension.h" #import <CommonCrypto/CommonCryptor.h> @implementation NSData (NSDataEncryptionExtension) - (NSData *)AES256EncryptWithKey:(NSString *)key { //do something } - (NSData *)AES256DecryptWithKey:(NSString *)key { //do something } 

और फिर अपने उद्देश्य-सी ब्रिजिंग हेडर में, यह जोड़ें

 #import "NSData+NSDataEncryptionExtension.h" 

और फिर स्विफ्ट क्लास में ऐसा कुछ भी होता है:

 public extension String { func encryp(withKey key:String) -> String? { if let data = self.data(using: .utf8), let encrypedData = NSData(data: data).aes256Encrypt(withKey: key) { return encrypedData.base64EncodedString() } return nil } func decryp(withKey key:String) -> String? { if let data = NSData(base64Encoded: self, options: []), let decrypedData = data.aes256Decrypt(withKey: key) { return decrypedData.UTF8String } return nil } } 

यह अपेक्षा के अनुरूप काम करता है

यह बहुत सरल है। जोड़ना

 #import <CommonCrypto/CommonCrypto.h> 

एक .h फ़ाइल (आपके प्रोजेक्ट की ब्रिजिंग हेडर फाइल) में एक सम्मेलन के रूप में आप इसे अपनी प्रोजेक्ट-नाम-ब्रिजिंग-हेडर एच।

फिर अपनी प्रोजेक्ट बिल्ड सेटिंग पर जाएं और स्विफ्ट कम्पाइलर – कोड जनरेशन देखें। इसके अंतर्गत, "ब्रिजिंग-हेड हेज़र" को प्रविष्ट करने के लिए अपने ब्रिजिंग हैडर का नाम जोड़ें

हो गया। आपके स्विफ्ट कोड में कोई आयात आवश्यक नहीं है इस ब्रिजिंग हैडर फ़ाइल में सूचीबद्ध कोई भी सार्वजनिक उद्देश्य-सी शीर्षलेख स्विफ्ट को दिखाई देगा।