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


184

आप CommonCryptoiOS के लिए स्विफ्ट ढांचे में कैसे आयात करते हैं ?

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

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

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

import FrameworkName

दुर्भाग्य से, आयात CommonCryptoकाम नहीं करता है। न तो #import <CommonCrypto/CommonCrypto.h>छाता हैडर से जोड़ता है।


CommonCrypto एक C- आधारित फ्रेमवर्क है, न कि कोई Objective-C फ्रेमवर्क।
रामादेवी

1
@rmaddy ऑब्जेक्टिव-सी एक सी सुपरसेट है। क्या आप कह रहे हैं कि हम स्विफ्ट से कॉमनक्रिप्ट का उपयोग नहीं कर सकते हैं?
hpique

4
@rmaddy मैं सिर्फ मॉड्यूल मैप्स का उपयोग करके काम करने के लिए कामन क्रिप्टो प्राप्त करने में कामयाब रहा। मैं समाधान को पॉलिश करूंगा और आज बाद में पोस्ट करूंगा।
hpique

यदि आपको यह सुविधा मिलती है, और जो आप खोज रहे हैं, वह पहले से ही लागू है, तो आप क्रिप्टोकरंसी की
Marcin

1
Apple ने केवल कॉमनट्रिप्टो को खोला। हो सकता है कि हमारे पास स्रोत हों तो हम इसे चला सकते हैं।
आईबैलज

जवाबों:


137

कुछ थोड़ा सरल और अधिक मजबूत है एक "एग्रीक्रीप्टोमोड्यूलापेज़" नामक एक एग्रीगेट लक्ष्य बनाना, रन स्क्रिप्ट के चरण के साथ मॉड्यूल मैप को स्वचालित रूप से और सही 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 बीटा संस्करण में स्विच करने के लिए करते हैं, या एक सीआई सर्वर पर निर्माण कर रहे हैं जहां कई संस्करण स्थापित हैं गैर-मानक स्थानों में। आपको SDK को हार्ड कोड करने की भी आवश्यकता नहीं है, इसलिए इसे iOS, macOS आदि के लिए काम करना चाहिए। आपको अपने प्रोजेक्ट के सोर्स डायरेक्टरी में बैठने की भी कोई आवश्यकता नहीं है।

इस लक्ष्य को बनाने के बाद, अपनी लाइब्रेरी / रूपरेखा को लक्ष्य निर्भरता मद के साथ उस पर निर्भर करें:

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

यह सुनिश्चित करेगा कि आपकी रूपरेखा तैयार होने से पहले मॉड्यूल का मानचित्र तैयार हो जाए।

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

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

अगला, ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMapस्विफ्ट अनुभाग के तहत "आयात पथ" बिल्ड सेटिंग में मॉड्यूल मैप की मूल निर्देशिका को जोड़ें SWIFT_INCLUDE_PATHS:

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

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

बस, अब आपको होना चाहिए import CommonCrypto

Xcode 10 के लिए अपडेट करें

Xcode 10 अब कॉमन क्रिप्टो मॉड्यूल मैप के साथ जहाजों को इस वर्कअराउंड को अनावश्यक बनाता है। यदि आप Xcode 9 और 10 दोनों का समर्थन करना चाहते हैं, तो आप रन स्क्रिप्ट चरण में एक चेक कर सकते हैं यह देखने के लिए कि क्या मॉड्यूल मैप मौजूद है या नहीं, उदाहरण के लिए।

COMMON_CRYPTO_DIR="${SDKROOT}/usr/include/CommonCrypto"
if [ -f "${COMMON_CRYPTO_DIR}/module.modulemap" ]
then
   echo "CommonCrypto already exists, skipping"
else
    # generate the module map, using the original code above
fi

8
यह उत्तर शीर्ष पर होना चाहिए। सरल और सुरुचिपूर्ण
अब्दुल्ला सईद

1
इस एक पर देर से खेल - लेकिन यह चुना जवाब होना चाहिए। यह सरल है और आवश्यकता को देखने के लिए उसी परियोजना पर अन्य देव के काम के लिए आसान है।
फेटफुल.लॉजिक

1
बहुत बढ़िया जवाब। धन्यवाद!
क्लॉस बस

1
अगर मैं अपने .framework में ऐसा करता हूं, तो क्या मुझे उन परियोजनाओं में भी ऐसा करना चाहिए जहां मैं इस ढांचे को शामिल करता हूं?
रवि किरण

2
@IanDundas I ने पुन: संकलन के मुद्दे के साथ-साथ
macOS

91

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

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

  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.11El Capitan नहीं चलने पर अपने वर्तमान OS SDK से बदलें ।)

  4. आपकी प्रोजेक्ट सेटिंग्स के जानकारी टैब पर, कॉन्फ़िगरेशन के तहत , कॉमन क्रिप्टोकरेंसी के डिबग और रिलीज़ कॉन्फ़िगरेशन को सेट करें ( कॉमन क्रिप्टोकरंसी को संदर्भित करते हुए )।

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

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

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

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


4
चरण (5) के बिना मेरे लिए काम करता है। इसके साथ मुझे एक बिल्ड त्रुटि मिलती है:ld: cannot link directly with /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.2.sdk/usr/lib/system/libcommonCrypto.dylib. Link against the umbrella framework 'System.framework' instead. for architecture x86_64
stannie

4
अति उत्कृष्ट! इसे github.com/soffes/Crypto बनाने के लिए उपयोग किया गया था, System.frameworkहालाँकि मुझे लिंक नहीं करना था । यह ध्यान देने योग्य है, आपको मैक और आईओएस के लिए एक अलग आवरण ढांचा बनाना होगा यदि आपका ढांचा क्रॉस प्लेटफॉर्म है।
सैम सॉफेस

32
कैसे या कहाँ लोगों को इस तरह से सामान मिलता है?
होला

5
बस एक नोट यह स्पष्ट करता है कि आपको चरण 1 में भाषा के रूप में ऑब्जेक्टिव-सी का चयन करने की आवश्यकता है। यह आसानी से अनदेखा है। इसके अलावा, शायद क्योंकि मेरे पास .dylib नहीं था, मुझे चरण 5 में .framework जोड़ने की आवश्यकता थी
Teo

7
यह भयानक है। मेरे पास एक्सकोड्स का एक चिड़ियाघर है, जो अलग-अलग तरीके से टूटे हुए हैं और सभी जगह हेडर के लिए निरपेक्ष रास्ते हैं, जो कि अजीब है। क्यूपर्टिनो में कुछ गलत हो रहा है, या कम से कम जो भी इस मॉड्यूलमैप मेस के प्रभारी हैं
एंटोन ट्रोपास्को

82

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

उपरोक्त के आधार पर, निम्न चरण हैं:

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

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

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

सेटिंग्स बनाएँ

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'। ऐसा इसलिए है क्योंकि कॉमनट्रिप्टो मॉड्यूल कस्टम फ्रेमवर्क के साथ शामिल नहीं होता है। चरण 2 (सेटिंग) को दोहराने के लिए एक समाधान हैImport Paths उस प्रोजेक्ट ) जो फ्रेमवर्क का उपयोग करता है।

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

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

अद्यतन / संपादित करें

मुझे निम्नलिखित बिल्ड त्रुटि मिलती रही:

ld: लाइब्रेरी के लिए नहीं मिला-आर्किटेक्चर के लिए -CommonCrypto x86_64 क्लैंग: त्रुटि: लिंकर कमांड एक्ज़िट कोड 1 के साथ विफल रहा (उपयोग -v को देखने के लिए आह्वान)

जब तक मैंने बनाई फ़ाइल link "CommonCrypto"से लाइन को हटा नहीं दिया module.map। एक बार जब मैंने इस लाइन को हटा दिया तो यह ठीक बना।


30
जी, Apple यकीन है कि चीजों को मुश्किल बनाना चाहते हैं। क्या यह स्विफ्टियों को मार देगा, बस हमें इस बीएस के माध्यम से जाने के बिना फ़ाइलों / रूपरेखाओं को आयात करने दें?
ज़ाफ़

4
यह $SDKROOTपरिवर्तनशील है क्योंकि चर आपको अज्ञेय पथ की अनुमति देने वाला है, लेकिन मुझे नहीं पता कि स्विफ्ट में इसे कैसे प्राप्त किया जाए।
danimal

2
मेरे लिए यह तब तक काम नहीं आया जब तक मैंने link "CommonCrypto"मॉड्यूल.मैप फ़ाइल से नहीं हटाया ।
Teo Sartori

1
क्या कोई Xcode 7.3 पर इस काम की पुष्टि कर सकता है? इस समाधान ने अपडेट के बाद मेरे लिए काम करना बंद कर दिया।
निकिता कुकुश्किन

1
Correnction: यह ठीक काम कर रहा है जब मैं सिम्युलेटर के लिए बनाते हैं लेकिन जोड़ने @ विफल रहता है जब मैं के साथ एक iOS 9.3 डिवाइस के लिए निर्माण "ld: वास्तुकला arm64 के लिए -lCommonCrypto के लिए नहीं मिला पुस्तकालय"
निकिता कुकुश्किन

50

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

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

मैं modulemapCommonCrypto https://github.com/onmyway133/arcane , https://github.com/onmyway133/Reindeer के आसपास अपने रैपर में उपयोग करता हूं

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

  • एक फ़ोल्डर CCommonCryptoयुक्त करेंmodule.modulemap

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

      ${SRCROOT}/Sources/CCommonCrypto

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

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

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

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

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

  • इसमें Build Settings -> Header Search Paths हैं

      $(SDKROOT)/usr/include/libxml2
  • इसमें Build Settings -> Other Linker Flags हैं

      -lxml2

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

Posts रोचक संबंधित पोस्ट


1
वाह! मेरे आश्चर्य करने के लिए, शीर्ष दृष्टिकोण से शीर्षलेख पथ (मॉड्यूल। मोड्यूलमैप फ़ाइल बनाकर) ने बहुत काम किया जब पहले से मॉड्यूलमैप फाइलें बहुत सारे मुद्दों का कारण बन रही थीं। मैं कुछ समय के लिए एक मॉड्यूल.मॉड्यूलमैप फ़ाइल का उपयोग करने के लिए इसके साथ संघर्ष कर रहा था/CommonCrypto/CommonCrypto.h केApplications/XCode.app/Contents/Developer/Platforms/iPhoneOS.... , जिसे नाम बदलने वाले लोगों के लिए मैनुअल संशोधन की आवश्यकता थी। उस लाइन को देखने के लिए स्विच "/usr/include/CommonCrypto/CommonCrypto.h"करना कई XCode संस्करणों वाली टीम के लिए ठीक काम करता है। आपको बहुत - बहुत धन्यवाद!
नतालिया

3
फली का निर्माण करते हुए, मैं SWIFT_INCLUDE_PATHS और preserve_paths सेट करता हूं। जब मैं दौड़ता हूं pod lib lint, लेकिन त्रुटि के साथ असफल हो जाता है: ऐसा कोई मॉड्यूल 'कॉमनट्रिप्टो' नहीं। मैं इससे कैसे निपट सकता हूं।
क्लेन मोक

1
समस्या से संबंधित नहीं है लेकिन मुझे इमोजी का उपयोग गोलियों के रूप में करना पसंद है! 😊
Fomentia

2
@ onmyway133 यदि आप $(PODS_ROOT)/CommonCryptoSwift/Sources/CCommonCryptoसाथ बदलते हैं तो स्थानीय विकास पॉड कार्यों का उपयोग करना $(PODS_TARGET_SRCROOT)/Sources/CCommonCryptoPODS_TARGET_SRCROOTस्थानीय फली के लिए सही ढंग से सेट किया गया है।
ओरखन अलीखानोव

शानदार जवाब, मेरी जान बचाई! बहुत - बहुत धन्यवाद
हसन शाहबाज़ी

45

खुशखबरी! स्विफ्ट 4.2 (Xcode 10) अंत में CommonCrypto प्रदान करता है!

बस import CommonCryptoअपनी स्विफ्ट फ़ाइल में जोड़ें ।


बढ़िया खबर! क्या आप दस्तावेज़ में लिंक जोड़ सकते हैं?
1935 में क्राइस्टोफ़ मटोज

मेरे पास दस्तावेज़ीकरण का लिंक नहीं है, मैंने एक प्रोजेक्ट को संकलित करने की कोशिश करते हुए यह पता लगाया, जहां मुझे Xcode 10 के साथ यहां वर्कअराउंड में से एक था। इसने शिकायत की कि यह दो CommonCryptoमॉड्यूल पा सकता है , इस प्रकार Apple को संदेह है कि अब मैंने अपना वर्कअराउंड हटा दिया और 'लो! यह सच था। मैंने इसके बारे में ट्वीट किया और एक Apple इंजीनियर ने जवाब दिया कि यह इरादा था।
mxcl

1
ऐप स्टोर मुझे केवल उपलब्ध अपडेट के रूप में 9.4.7 दिखा रहा है, आपको Xcode 10 कैसे मिला?
हम्माद तारिक

1
यह एक तुच्छ Google खोज के रूप में बीटा में है जो आपको बताया होगा।
mxcl

1
@SomoyDasGupta हाँ। बस पिछले आयात को हटा दें, और इसे फिर से संकलित करें। दूसरे शब्दों में, आपको माइकवेलर जवाब से कदम उठाने की ज़रूरत नहीं है
COLD ICE

7

चेतावनी: iTunesConnect इस पद्धति का उपयोग करने वाले ऐप्स को अस्वीकार कर सकता है ।


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

pod 'CommonCryptoModule', '~> 1.0.2'

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

import CommonCryptoModule

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


चेतावनी: यदि आप इस पद्धति का उपयोग करते हैं तो आपका आवेदन अस्वीकार कर दिया जाएगा!
सेगाबोंड

हाँ, हम साथ ही खारिज कर दिया, बहुत अजीब है, क्योंकि हम इस पद्धति का उपयोग करके कई महीनों तक कोई समस्या नहीं के साथ अपलोड कर रहे थे।
निकिता कुकुश्किन

5

मुझे लगता है कि मेरे पास माइक वेलर के उत्कृष्ट कार्य में सुधार है।

Compile Sourcesइस बैश वाले चरण से पहले एक रन स्क्रिप्ट चरण जोड़ें :

# This if-statement means we'll only run the main script if the
# CommonCrypto.framework 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

FRAMEWORK_DIR="${BUILT_PRODUCTS_DIR}/CommonCrypto.framework"

if [ -d "${FRAMEWORK_DIR}" ]; then
echo "${FRAMEWORK_DIR} already exists, so skipping the rest of the script."
exit 0
fi

mkdir -p "${FRAMEWORK_DIR}/Modules"
cat <<EOF > "${FRAMEWORK_DIR}/Modules/module.modulemap"
module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}
EOF

ln -sf "${SDKROOT}/usr/include/CommonCrypto" "${FRAMEWORK_DIR}/Headers"

यह स्क्रिप्ट सही जगह पर मॉड्यूल.मैप के साथ एक नंगे हड्डियों के ढांचे का निर्माण करती है और फिर Xcode की स्वचालित खोज पर निर्भर करती है BUILT_PRODUCTS_DIR फ्रेमवर्क लिए है।

मैंने मूल कॉमन क्रिप्टोकरंसी को फोल्डर में फ्रेमवर्क के हेडर्स फोल्डर के रूप में शामिल किया है ताकि परिणाम भी उद्देश्य सी परियोजनाओं के लिए कार्य करे।


CocoaPods में उपयोग को शामिल करने वाले सुधार के लिए DVDblk का उत्तर देखें ।
जर्जरकोट

5

Xcode 10 के साथ स्विफ्ट 4.2 का उपयोग करने वाले किसी के लिए :

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

import CommonCrypto

@ Mxcl के उत्तर का डुप्लिकेट: stackoverflow.com/a/50690346/9988514
रेनर श्वार्ज़

4

@ मोगस्टा एक कोकोपोड में @stephencelis घोल लपेटने के लिए पर्याप्त है:

फली 'libCommonCrypto'

उपलब्ध अन्य पॉड्स ने मेरे लिए काम नहीं किया।


4

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

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

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

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

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

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


मैंने इसे मज़बूती से संकलित करने के लिए पाया और यह सरल है। क्या फ्रेमवर्क का उपयोग करने वाले एप्लिकेशन को कुछ विशेष से लिंक करने की आवश्यकता है, या क्या कॉमनट्रिप्टो हमेशा उपलब्ध है?
कोडिंगफ्रीड 1

1
मुझे लगता Security.frameworkहै कि स्वचालित रूप से जुड़ा हुआ है (यह एक नई परियोजना शुरू करने के बाद से थोड़ा समय है)। यदि आपको त्रुटियां हैं, तो लिंक करने की रूपरेखा है।
रोब नेपियर

यह सबसे सरल समाधान की तरह लगता है और यह एक मशीन पर बहुत अच्छा काम करता है, लेकिन जब भी मैं किसी अन्य फ्रेमवर्क, या ऐप में फ्रेमवर्क का उपयोग करता हूं, तो दूसरी मशीन पर मुझे 'लापता मॉड्यूल' त्रुटि मिलती है।
richever

2

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

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

#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
}
}

यह उम्मीद के मुताबिक काम करता है।


यह बहुत आसानी से काम करता है, और यहां तक ​​कि आपको इंटर्न को आंतरिक रखने की अनुमति देता है ( NSData+NSDataEncryptionExtension.hसार्वजनिक नहीं होना पड़ता है)।
राफेल

लेकिन इस चीज का उपयोग करने के लिए मुझे किस ओएस फ्रेमवर्क के खिलाफ लिंक करना चाहिए? दूसरों के विपरीत - मुझे एक Obj-C प्रोजेक्ट में कॉमनट्रिप्टो के साथ काम करना है, और वह अकेले MacOS-10.13 SDK के साथ Xcode 9 पर टूट जाता है
Motti Shneor

@MottiShneor 10.9 या उससे ऊपर के किसी भी OS को लिंक करें। मैं एक ही माहौल पर काम कर रहा हूं और यह ठीक काम करता है।
टेरेंस

2

मैंने अपने कोकोपीड्स लाइब्रेरी में कॉमन क्रिप्टो का उपयोग करने की आवश्यकता के मामले में jjrscott के उत्तर में कुछ कोकोपोड्स जादू जोड़ दिया है।


1) इस लाइन को अपने पॉडसेक में जोड़ें:

s.script_phase = { :name => 'CommonCrypto', :script => 'sh $PROJECT_DIR/../../install_common_crypto.sh', :execution_position => :before_compile }

2) इसे अपने लाइब्रेरी फोल्डर में या जहाँ भी आप चाहें सेव करें (हालाँकि इसके अनुसार script_phase को बदलना न भूलें ...)

# This if-statement means we'll only run the main script if the
# CommonCrypto.framework 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
FRAMEWORK_DIR="${BUILT_PRODUCTS_DIR}/CommonCrypto.framework"

if [ -d "${FRAMEWORK_DIR}" ]; then
echo "${FRAMEWORK_DIR} already exists, so skipping the rest of the script."
exit 0
fi

mkdir -p "${FRAMEWORK_DIR}/Modules"
echo "module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}" >> "${FRAMEWORK_DIR}/Modules/module.modulemap"

ln -sf "${SDKROOT}/usr/include/CommonCrypto" "${FRAMEWORK_DIR}/Headers"

एक जादू की तरह काम करता है :)


क्या आप पॉड स्पेक फ़ाइल के साथ ही डेमो या सैंपल फ्रेमवर्क प्रोजेक्ट प्रदान कर सकते हैं?
गौतम

0

मुझे यकीन नहीं है कि कुछ Xcode 9.2 के साथ बदल गया है, लेकिन इसे हासिल करना अब बहुत आसान है। केवल एक चीज जो मुझे करनी थी, वह है कि "फ्रेमवर्क क्रिप्टोकरंसी" नामक एक फोल्डर मेरी फ्रेमवर्क डायरेक्टरी में बनाया गया है और इसके अंदर दो फाइलें बनाई गई हैं, एक को "cc.h" कहा जाता है:

#include <CommonCrypto/CommonCrypto.h>
#include <CommonCrypto/CommonRandom.h>

और एक अन्य मॉड्यूल। मॉड्यूल

module CommonCrypto {
    export *
    header "cc.h"
}

(मुझे नहीं पता कि आप SDKROOT क्षेत्र से हेडर फ़ाइलों को सीधे एक मॉड्यूलमैप फ़ाइल में क्यों नहीं संदर्भित कर सकते हैं, लेकिन मुझे यह काम करने के लिए नहीं मिला)

तीसरी बात "इम्पोर्ट पाथ्स" की स्थापना और $ (SRCROOT) पर सेट करना है। वास्तव में आप इसे उस फ़ोल्डर में सेट कर सकते हैं जिसे आप चाहते हैं कि कॉमनक्रिप्टो फोल्डर आपके अधीन हो, यदि आप इसे रूट स्तर पर नहीं चाहते हैं।

इसके बाद आपको उपयोग करने में सक्षम होना चाहिए

import CommonCrypto

किसी भी स्विफ्ट फ़ाइल में और सभी प्रकार / फ़ंक्शन / आदि। उपलब्ध हैं।

हालाँकि चेतावनी का एक शब्द - यदि आपका ऐप libCommonCrypto (या libcoreCrypto) का उपयोग करता है, तो यह आपके ऐप के डिबगर को संलग्न करने के लिए एक असाधारण-हैकर के लिए असाधारण रूप से आसान है और पता लगा सकता है कि इन कार्यों के लिए क्या कुंजी पारित की जा रही हैं।


0

मामले में आप नीचे मुद्दा है:

ld: लाइब्रेरी को -lapple_crypto क्लैंग के लिए नहीं मिला: त्रुटि: लिंकर कमांड निकास कोड 1 के साथ विफल हुआ (उपयोग -v को देखने के लिए)

Xcode 10 में, स्विफ्ट 4.0। कॉमनट्रिप्टो फ्रेमवर्क का एक हिस्सा है।

जोड़ना

 import CommonCrypto

हटाना

  • बिल्ड चरणों से पुस्तकालयों के साथ लिंक बाइनरी से CommonCrpto lib फ़ाइल
  • import CommonCrypto ब्रिजिंग हेडर से

यह मेरे लिए काम किया!


-1

एक्सकोड अपडेट करने के बाद मेरे साथ भी ऐसा ही हुआ। मैंने सब कुछ करने की कोशिश की, जैसे कि कोकोपोड्स को फिर से स्थापित करना और परियोजना की सफाई करना, लेकिन यह काम नहीं करता था। अब यह सिस्टम को पुनरारंभ करने के बाद हल हो गया है।


-13

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

#import <CommonCrypto/CommonCrypto.h>

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

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

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


आपकी विधि त्रुटि लौटाती है: फ्रेमवर्क लक्ष्य के साथ ब्रिजिंग हेडर का उपयोग असमर्थित है
gorgi93

5
@ gorgi93 त्रुटि के सुझाव के अनुसार, आप एक फ्रेमवर्क लक्ष्य में ब्रिजिंग हेडर का उपयोग नहीं कर सकते हैं। एकमात्र विकल्प इसे मुख्य रूपरेखा हेडर फ़ाइल में रखना है, दुर्भाग्य से।
चार्ल्स ए।

1
यदि आपने वास्तव में इस धागे का शीर्षक लाल कर दिया था, तो आपने देखा होगा कि आदमी कॉमनट्रिप्टो लाइब्रेरी को स्विफ्ट फ्रेमवर्क में आयात करना चाहता है। आप चौखटे में ब्रिजिंग हेडर का उपयोग नहीं कर सकते हैं, और आप कॉमन क्रिप्टोकरंसी को छतरी हेडर में आयात नहीं कर सकते।
miken.mkndev
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.