একটি সুইফ্ট ফ্রেমওয়ার্কে কমনক্রিপ্টো আমদানি করা


184

আপনি কীভাবে আমদানি করবেন CommonCrypto আইওএসের জন্য একটি সুইফ্ট কাঠামোয় করবেন?

আমি কীভাবে CommonCryptoসুইফট অ্যাপ্লিকেশনটিতে ব্যবহার করব তা বুঝতে পেরেছি : আপনি #import <CommonCrypto/CommonCrypto.h>ব্রিজিং শিরোনামে যুক্ত হন। তবে, সুইফ্ট ফ্রেমওয়ার্কগুলি ব্রিজিং শিরোলেখ সমর্থন করে না। ডকুমেন্টেশন বলেছেন:

আপনি খাঁটি অবজেক্টিভ সি কোডবেস, একটি খাঁটি সুইফ্ট কোডবেস, বা একটি মিশ্র-ভাষার কোডবেসযুক্ত বাহ্যিক ফ্রেমওয়ার্কগুলি আমদানি করতে পারেন। বাহ্যিক কাঠামোটি আমদানির প্রক্রিয়াটি একই রকম হয় যে ফ্রেমওয়ার্কটি কোনও একক ভাষায় লেখা হয় বা উভয় ভাষার ফাইল থাকে। আপনি যখন কোনও বাহ্যিক কাঠামো আমদানি করেন, আপনি যে ফ্রেমপোর্টটি আমদানি করছেন তার মডিউল বিল্ড সেটিংস হ্যাঁ সেট করা আছে তা নিশ্চিত করুন।

আপনি নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করে কোনও ভিন্ন টার্গেটের মধ্যে যে কোনও সুইফট ফাইলের মধ্যে একটি ফ্রেমওয়ার্ক আমদানি করতে পারেন:

import FrameworkName

দুর্ভাগ্যক্রমে, আমদানি CommonCryptoকাজ করে না। #import <CommonCrypto/CommonCrypto.h>ছাতা শিরোনামেও যোগ হয় না।


কমনক্রিপ্টো একটি সি-ভিত্তিক কাঠামো, কোনও উদ্দেশ্য-সি কাঠামো নয়।
rddy

1
@rmaddy উদ্দেশ্য-সি একটি সি সুপারসেট আপনি কি বলছেন যে আমরা সুইফট থেকে কমনক্রিপ্টো ব্যবহার করতে পারি না?
এইচপিক

4
@ আরমডি আমি মডিউল মানচিত্র ব্যবহার করে কমনক্রিপ্টোকে কাজ করতে সক্ষম করেছিলাম। আমি সমাধানটি পোলিশ করব এবং পরে এটি পরে পোস্ট করব।
এইচপিক

যদি আপনি এটির সুবিধাদি খুঁজে পান এবং আপনি যা সন্ধান করছেন তা ইতিমধ্যে বাস্তবায়িত হয়ে গেছে, আপনি ক্রিপ্টোসুইফ্ট
মার্সিন

1
অ্যাপল সর্বাধিক সোর্সযুক্ত কমনক্রিপ্টো খুলুন। আমাদের যদি সূত্র থাকে তবে আমরা এটি চালিয়ে যেতে পারি।
আইবলজজ

উত্তর:


137

মডিউলটি স্বয়ংক্রিয়ভাবে তৈরি করতে এবং সঠিক এক্সকোড / এসডিকে পাথের সাহায্যে রান স্ক্রিপ্ট ধাপের সাথে "কমনক্রিপ্টোমডিউল ম্যাপ" নামে একটি সমষ্টিগত লক্ষ্য তৈরি করা কিছুটা সহজ এবং আরও দৃust়তম কিছু:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

রান স্ক্রিপ্ট পর্যায়ে এই ব্যাশ থাকা উচিত:

# 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 একটি বিটা সংস্করণে স্যুইচ করেন বা সিআই সার্ভারে তৈরি করছেন যেখানে একাধিক সংস্করণ ইনস্টল করা আছে অ-মানক অবস্থানগুলিতে। আপনার এসডিকে হার্ড কোড করারও দরকার নেই তাই এটি আইওএস, ম্যাকোস ইত্যাদির জন্য কাজ করা উচিত your আপনার প্রকল্পের উত্স ডিরেক্টরিতে আপনার কিছু বসাতে হবে না।

এই লক্ষ্যটি তৈরির পরে, আপনার লাইব্রেরি / কাঠামোটিকে লক্ষ্য নির্ভরতা আইটেমটির সাথে নির্ভর করে:

এখানে চিত্র বর্ণনা লিখুন

এটি আপনার কাঠামোটি তৈরি হওয়ার আগে মডিউল মানচিত্র তৈরি হওয়ার বিষয়টি নিশ্চিত করবে।

ম্যাকোস দ্রষ্টব্য : আপনি যদি macOSপাশাপাশি সমর্থন করে থাকেন তবে আপনার সদ্য নির্মিত নতুন সামগ্রিক টার্গেটের উপরে বিল্ড সেটিংটি যুক্ত macosxকরতে Supported Platformsহবে, অন্যথায় এটি মডিউল মানচিত্রটিকে Debugবাকী অংশের সাথে সঠিক উত্পন্ন ডেটা ফোল্ডারে রাখবে না ফ্রেমওয়ার্ক পণ্য।

এখানে চিত্র বর্ণনা লিখুন

এরপরে, ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMapসুইফ্ট বিভাগের অধীনে "আমদানি পথগুলি" বিল্ড সেটিংয়ে মডিউল মানচিত্রের মূল ডিরেক্টরিটি যুক্ত করুন SWIFT_INCLUDE_PATHS:

এখানে চিত্র বর্ণনা লিখুন

$(inherited)যদি আপনার প্রকল্প বা xcconfig স্তরে সংজ্ঞায়িত সন্ধানের পথ থাকে তবে একটি লাইন যুক্ত মনে রাখবেন ।

এটাই, আপনার এখন সক্ষম হওয়া উচিত import CommonCrypto

এক্সকোড 10 এর জন্য আপডেট

এক্সকোড 10 এখন একটি কমনক্রিপ্টো মডিউল মানচিত্র সহ জাহাজগুলি এই কাজটিকে অপ্রয়োজনীয় করে তোলে। আপনি যদি এক্সকোড 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
এইটি থেকে খেলতে দেরীতে - তবে এটি নির্বাচিত উত্তর হওয়া উচিত। এটি সহজ এবং অন্যান্য দেবের একই প্রকল্পে কাজ করা প্রয়োজনীয়তা দেখার পক্ষে এটি সহজ।
fatuous.logic

1
দুর্দান্ত উত্তর। ধন্যবাদ!
ক্লাউস বুসে

1
আমি যদি আমার। ফ্রেমে ওয়ার্কে এটি করি তবে যে প্রকল্পগুলিতে আমি এই কাঠামোটি অন্তর্ভুক্ত করব সেখানে কি আমাকে একই কাজ করা উচিত?
রবি কিরণ

2
@ ইয়ানডুন্ডাস আমি পুনরায় সংকলন ইস্যুটির
ঠিকানার পাশাপাশি

91

আপনি আসলে এমন একটি সমাধান তৈরি করতে পারেন যা "কেবলমাত্র কাজ করে" ( আপনার প্রকল্পে কোনও মডিউল.মডিউলম্যাপ এবং SWIFT_INCLUDE_PATHSসেটিংস অনুলিপি করার দরকার নেই , অন্য সমাধানগুলির দ্বারা এখানে প্রয়োজনীয় হিসাবে প্রয়োজন), তবে এটির জন্য আপনাকে একটি ডামি ফ্রেমওয়ার্ক / মডিউল তৈরি করতে হবে যা আপনি ' আপনার কাঠামোর যথাযথভাবে আমদানি করব। আমরা নিশ্চিত করতে পারে এটা প্ল্যাটফর্ম নির্বিশেষে কাজ করে ( iphoneos, iphonesimulator, অথবা macosx)।

  1. আপনার প্রকল্পে একটি নতুন কাঠামো লক্ষ্য যুক্ত করুন এবং এটি সিস্টেম লাইব্রেরির নামকরণ করুন, যেমন , "কমনক্রিপ্টো"। (আপনি ছাতা শিরোনাম মুছে ফেলতে পারেন, কমনক্রিপ্টো ।)

  2. একটি নতুন কনফিগারেশন সেটিংস ফাইল যুক্ত করুন এবং এর নাম দিন, যেমন , "CommonCrypto.xcconfig"। (অন্তর্ভুক্তির জন্য আপনার টার্গেটগুলির মধ্যে কোনওটি চেক করবেন না with) নিম্নলিখিতটি দিয়ে এটি তৈরি করুন:

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

    (আপনি যদি বিটা সংস্করণটি চালাচ্ছেন তবে "এক্সকোড.অ্যাপ "টিকে" এক্সকোড-বিটা.এপ "দিয়ে প্রতিস্থাপন করুন 10.11El এল ক্যাপিটান না চালিয়ে আপনার বর্তমান ওএস এসডিকে দিয়ে প্রতিস্থাপন করুন ))

  4. উপর তথ্য আপনার প্রকল্পের সেটিংস ট্যাব, অধীনে কনফিগারেশনগুলির , সেট ডিবাগ এবং রিলিজ খাবলে CommonCrypto করার CommonCrypto (উল্লেখ CommonCrypto.xcconfig )।

  5. আপনার কাঠামোর টার্গেটের বিল্ড পর্যায়গুলি ট্যাবে, লক্ষ্য নির্ভরতাগুলিতে কমনক্রিপ্টো কাঠামো যুক্ত করুন । উপরন্তু যোগ libcommonCrypto.dylib করার লিংক বাইনারি সঙ্গে লাইব্রেরি বিল্ড ফেজ।

  6. নির্বাচন CommonCrypto.framework মধ্যে পণ্য এবং নিশ্চিত তার করা উদ্দিষ্ট সদস্যপদ জন্য আপনার মোড়কের সেট করা হয় ঐচ্ছিক

আপনার এখন তৈরি করা, চালানো এবং import CommonCryptoআপনার মোড়ক কাঠামোতে সক্ষম হওয়া উচিত ।

উদাহরণস্বরূপ, দেখুন কীভাবে এসকিউএল.ইউইফ্টটি একটি ডামি স্ক্লাইট 3.ফ্রেমওয়ার্ক ব্যবহার করে ।


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
পেয়েছি

4
অসাধারণ! Github.com/soffes/Crypto তৈরি করতে এটি ব্যবহার করুন System.frameworkযদিও আমাকে লিঙ্ক করতে হয়নি । এটি লক্ষণীয়, আপনার ফ্রেমওয়ার্ক যদি ক্রস প্ল্যাটফর্ম হয় তবে আপনাকে ম্যাক এবং আইওএসের জন্য একটি পৃথক মোড়ক কাঠামো তৈরি করতে হবে।
স্যাম সোফেস

32
লোকেরা কীভাবে বা কোথায় এই জাতীয় জিনিসগুলি খুঁজে পাবে?
hola

5
কেবলমাত্র একটি নোট এটি পরিষ্কার করে দেয় যে আপনাকে পদক্ষেপ 1 এ ভাষা হিসাবে উদ্দেশ্য-সি নির্বাচন করতে হবে এটি সহজেই উপেক্ষা করা হয়। এছাড়াও, সম্ভবত আমার .dlib না থাকায়, আমার 5 ধাপে। ফ্রেমওয়ার্কটি যুক্ত করা দরকার ছিল
টিও সার্টোরি

7
এটা ভয়াবহ। আমার প্রতিটি Xcodes এর চিড়িয়াখানা রয়েছে যা প্রতিটি পৃথকভাবে ভেঙে গেছে এবং পুরো জায়গাতে শিরোনামগুলির কাছে পরম পাথগুলি হ'ল পুককে অনুরোধ করছে। কাপার্টিনোতে কোনও কিছু মারাত্মকভাবে ভুল হয়ে যাচ্ছে, বা কমপক্ষে এই মডিউলম্যাপ জগাখিচুয়ের দায়িত্বে থাকা ব্যক্তির সাথে
আন্তন ট্রপ্যাশকো

82

আমি একটি গিটহাব প্রকল্পটি পেয়েছি যা সফলভাবে কমনক্রিপ্টোকে একটি সুইফ্ট কাঠামোর মধ্যে ব্যবহার করে: SHA256- সুইফ্ট । এছাড়াও, 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'। এটি কারণ কমনক্রিপ্টো মডিউলটি কাস্টম ফ্রেমওয়ার্কের সাথে অন্তর্ভুক্ত বলে মনে হচ্ছে না। Import Pathsপ্রকল্পের কাঠামোটি ব্যবহার করে এমন পদক্ষেপ 2 (সেটিং ) পুনরাবৃত্তি করা একটি কর্মপরিকল্পনা ।

মডিউল মানচিত্রটি প্ল্যাটফর্মটি স্বতন্ত্র নয় (এটি বর্তমানে একটি নির্দিষ্ট প্ল্যাটফর্ম, আইওএস 8 সিমুলেটরকে নির্দেশ করে)। আমি জানি না কীভাবে বর্তমান প্ল্যাটফর্মের সাথে তুলনা করে শিরোলেখের পথ তৈরি করা যায়।

আইওএস 8 এর জন্য আপডেট <= আমাদের সফল সংকলন পেতে আমাদের "কমনক্রিপ্টো" লাইন লিঙ্কটি সরিয়ে ফেলা উচিত ।

আপডেট / সম্পাদনা

আমি নিম্নলিখিত বিল্ড ত্রুটি পেয়েছি:

ld: আর্কিটেকচারের জন্য -lCommonCrypto এর জন্য লাইব্রেরি পাওয়া যায়নি x86_64 বিড়ম্বনা: ত্রুটি: লিঙ্কার কমান্ডটি প্রস্থান কোড 1 সহ ব্যর্থ হয়েছে (অনুরোধ দেখতে -v ব্যবহার করুন)

আমি তৈরি করা ফাইল link "CommonCrypto"থেকে লাইনটি সরিয়ে না module.mapদিলে। একবার আমি এই লাইনটি সরিয়ে ফেললাম ঠিক আছে।


30
জি, অ্যাপল নিশ্চিতভাবেই জিনিসগুলিকে কঠিন করে তুলবে। এটি কি আমাদের সমস্ত বিএস পেরিয়ে না গিয়ে কেবল ফাইল / ফ্রেমওয়ার্ক আমদানি করতে সুইফটিকে হত্যা করবে?
zaph

4
$SDKROOTভেরিয়েবলটি আপনাকে অজ্ঞেয় পথের প্ল্যাটফর্মের অনুমতি দেওয়ার কথা বলে এটি উদ্বেগজনক , তবে কীভাবে সুইফটে উঠবেন সে সম্পর্কে আমার কোনও ধারণা নেই।
ড্যানিমাল

2
আমার জন্য এটি কাজ করে না যতক্ষণ না আমি link "CommonCrypto"মডিউল.ম্যাপ ফাইলটি সরিয়ে ফেলি।
টিও সার্টোরি

1
এক্সকোড 7.3 এ কেউ এই কাজটি নিশ্চিত করতে পারে? এই সমাধানটি আপডেটের পরে আমার জন্য কাজ করা বন্ধ করে দিয়েছে।
নিকিতা কুকুশকিন

1
সংশোধন: আমি যখন সিমুলেটার তৈরি করি তখন এটি ঠিকঠাক হয়, তবে আমি "এলডি: আর্কিটেকচার আর্ম 64 এর জন্য -lCommonCrypto- এর জন্য লাইব্রেরিটি খুঁজে পাইনি"
নিকিতা

50

এই উত্তরটি কীভাবে এটি একটি কাঠামোর ভিতরে কাজ করবে এবং কোকোপডস এবং কার্থেজ নিয়ে আলোচনা করবে discus

🐟 মডিউলম্যাপ পদ্ধতির

আমি modulemapকমনক্রিপ্টো 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

Module মডিউলম্যাপ পদ্ধতির সাথে কোকোপডস

🐘 পাবলিক শিরোনাম পদ্ধতির

  • জি 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 জন্য শিরোনাম ফাইলগুলির একটি তালিকা রয়েছে

  • এটিতে বিল্ড সেটিংস -> শিরোনাম অনুসন্ধানের পাথ রয়েছে

      $(SDKROOT)/usr/include/libxml2
  • এটিতে বিল্ড সেটিংস -> অন্যান্য লিঙ্কার পতাকা রয়েছে

      -lxml2

Public পাবলিক শিরোনাম পদ্ধতির সাথে কোকোপড

Related আকর্ষণীয় সম্পর্কিত পোস্ট


1
কি দারুন! আমার অবাক করার বিষয় হচ্ছে, পূর্বের মডিউলম্যাপ ফাইলগুলি যখন প্রচুর সমস্যার কারণ হয়ে দাঁড়িয়েছিল তখন শীর্ষের পদ্ধতির (মডিউল.মডিউলম্যাপ ফাইল তৈরি করা) হেডার পাথ দুর্দান্ত কাজ করেছে। আমি এর সাথে কিছুক্ষণের জন্য লড়াই করে যাচ্ছিলাম একটি মডিউল.মডিউলম্যাপ ফাইলটি এর /CommonCrypto/CommonCrypto.hমধ্যে একটি নিখুঁত পথ সহ ব্যবহার করে যা এক্সকোডের Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS....নাম পরিবর্তন করে এমন লোকদের জন্য ম্যানুয়াল পরিবর্তন প্রয়োজন। দেখার জন্য এই লাইনটি স্যুইচ করা "/usr/include/CommonCrypto/CommonCrypto.h"বেশ কয়েকটি এক্সকোড সংস্করণ সহ একটি দলের পক্ষে দুর্দান্ত কাজ করবে বলে মনে হচ্ছে। তোমাকে অনেক ধন্যবাদ!
নাটালিয়া

3
আমি একটি পোড তৈরি করছি, আমি SWIFT_INCLUDE_PATHS এবং সংরক্ষণ_পথ সেট করেছি। আমি যখন চালনা করি pod lib lintতবে ত্রুটি সহ বিল্ড ব্যর্থ হয়: এ জাতীয় কোনও মডিউল 'কমনক্রিপ্টো' নেই। আমি কীভাবে এটি মোকাবেলা করতে পারি।
ক্লিন মিওকে

1
সমস্যার সাথে সম্পর্কিত নয় তবে আমি বুলেট হিসাবে ইমোজি ব্যবহার পছন্দ করি! 😊
ফোমেটিয়া

2
@ onmyway133 স্থানীয় উন্নয়ন পড ব্যবহার করে আপনি যদি প্রতিস্থাপন করেন তবে কাজ $(PODS_ROOT)/CommonCryptoSwift/Sources/CCommonCryptoকরে $(PODS_TARGET_SRCROOT)/Sources/CCommonCryptoPODS_TARGET_SRCROOTস্থানীয় পোডগুলির জন্য সঠিকভাবে সেট করা আছে।
অরখান আলিখানোভ

দুর্দান্ত উত্তর, আমার জীবন বাঁচাল! এক মিলিয়ন ধন্যবাদ
হাসান শাহবাজী

45

ভাল খবর! সুইফট 4.2 (এক্সকোড 10) অবশেষে কমনক্রিপ্টো সরবরাহ করে!

import CommonCryptoআপনার সুইফ্ট ফাইলটিতে কেবল যুক্ত করুন।


বড় খবর! আপনি কি ডকুমেন্টেশনের লিঙ্কটি যুক্ত করতে পারেন?
Kryštof Matěj

ডকুমেন্টেশনের সাথে আমার কোনও লিঙ্ক নেই, আমি একটি প্রকল্প সংকলনের চেষ্টা করতে গিয়ে এটি আবিষ্কার করেছিলাম যেখানে আমার এক্সকোড 10 দিয়ে এখানে কাজের ক্ষেত্রগুলির একটি ছিল It এটি অভিযোগ করেছে যে এটি দুটি খুঁজে পেতে পারে CommonCrypto মডিউল , সুতরাং অ্যাপলকে এখন সন্দেহ করা হয়েছে যে আমি আমার কাজের সরিয়ে ফেললাম এবং 'দেখ! এটা সত্য ছিল. আমি এটি সম্পর্কে টুইট করেছি এবং একটি অ্যাপল ইঞ্জিনিয়ার নিশ্চিত হয়ে জবাব দিয়েছিলেন যে এটি উদ্দেশ্যযুক্ত।
এমএক্সসিএল

1
অ্যাপ স্টোরটি কেবলমাত্র উপলভ্য আপডেট হিসাবে আমাকে 9.4.7 দেখাচ্ছে, আপনি এক্সকোড 10 কীভাবে পেয়েছেন?
হামাদ তারিক

1
এটি বিটাতে যেমন একটি তুচ্ছ Google অনুসন্ধান আপনাকে জানায়।
এমএক্সসিএল

1
@ সুময়ডাসগুপ্ত হ্যাঁ কেবল পূর্ববর্তী আমদানি সরান, এবং এটি আবার সংকলন করুন। অন্য কথায়, আপনাকে মাইকওলারের উত্তর থেকে পদক্ষেপগুলি করতে হবে না
COLD ICE

7

সতর্কতা: আইটিউনস কানেক্টটি এমন অ্যাপ্লিকেশনগুলি প্রত্যাখ্যান করতে পারে যা এই পদ্ধতিটি ব্যবহার করছে।


আমার টিমের নতুন সদস্য দুর্ঘটনাক্রমে শীর্ষগুলির উত্তরগুলির মধ্যে একটির সমাধানটি ভেঙে ফেলেছেন , তাই আমি এটিকে কমনক্রিপ্টোমোডুল নামে একটি ছোট মোড়ক প্রকল্পে একত্রীকরণের সিদ্ধান্ত নিয়েছি । আপনি এটি ম্যানুয়ালি বা কোকোপডগুলির মাধ্যমে ইনস্টল করতে পারেন:

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"

এই স্ক্রিপ্টটি সঠিক জায়গায় মডিউল.ম্যাপের সাথে একটি খালি হাড়ের কাঠামো তৈরি করে এবং তারপরে BUILT_PRODUCTS_DIRফ্রেমওয়ার্কগুলির জন্য এক্সকোডের স্বয়ংক্রিয় অনুসন্ধানের উপর নির্ভর করে ।

আমি যুক্ত করলাম মূল কমনক্রিপ্টোকে ফোল্ডারের শিরোনাম ফোল্ডার হিসাবে ফোল্ডার অন্তর্ভুক্ত করা যাতে ফলাফলটিও সিটি প্রকল্পগুলির জন্য কাজ করা উচিত।


কোকোপডস-এর ব্যবহার কভার করে এমন উন্নতির জন্য ডিভিডিবিএলকের উত্তর দেখুন ।
jjrscott

5

এক্সকোড 10 সহ যে কেউ সুইফট 4.2 ব্যবহার করছে তাদের জন্য :

কমনক্রিপ্টো মডিউলটি এখন সিস্টেম দ্বারা সরবরাহ করা হয়েছে, যাতে আপনি অন্য সিস্টেম কাঠামোর মতোই সরাসরি এটি আমদানি করতে পারেন।

import CommonCrypto

: @ Mxcl এর উত্তর সদৃশ stackoverflow.com/a/50690346/9988514
রাইনার কালো

4

@ মোগস্টাড কোকোপোডে @ স্টেপেনসিলিস সমাধানটি গুটিয়ে রাখতে যথেষ্ট সদয় ছিলেন:

শুঁটি 'libCommonCrypto'

উপলব্ধ অন্যান্য পোডগুলি আমার পক্ষে কার্যকর হয়নি।


4

মডিউলম্যাপ সমাধানগুলি ভাল হতে পারে, এবং এসডিকে পরিবর্তনের বিরুদ্ধে দৃust়, তবে আমি অনুশীলনে ব্যবহার করার জন্য এগুলিকে বিশ্রী বলে মনে করেছি এবং জিনিসগুলি অন্যের হাতে দেওয়ার সময় আমার মতো নির্ভরযোগ্য নয়। এটিকে আরও বোকা বানানোর চেষ্টা করার জন্য, আমি অন্যভাবে চলেছি:

কেবল শিরোনামগুলি অনুলিপি করুন।

আমি জানি, ভঙ্গুর তবে অ্যাপল প্রায়শই কমনক্রিপ্টোতে উল্লেখযোগ্য পরিবর্তন আনেনি এবং আমি স্বপ্নে বেঁচে আছি যে তারা শেষ পর্যন্ত কমনক্রিপ্টোকে মডিউলার শিরোনাম না করে কোনও গুরুত্বপূর্ণ উপায়ে এটি পরিবর্তন করবে না।

"শিরোনামগুলি অনুলিপি করুন" এর অর্থ "প্রিপ্রোসেসর যেমনটি করেন তেমনই আপনার প্রকল্পের একটি বড় শিরোনামে আপনার প্রয়োজনীয় সমস্ত শিরোনাম কেটে পেস্ট করুন।" এটির অনুলিপি হিসাবে আপনি অনুলিপি বা মানিয়ে নিতে পারেন, দেখুন আরএনক্রিপ্টার

নোট করুন যে এগুলি সমস্ত ফাইল এপিএসএল ২.০ এর আওতায় লাইসেন্সযুক্ত এবং এই পদ্ধতিটি ইচ্ছাকৃতভাবে কপিরাইট এবং লাইসেন্স বিজ্ঞপ্তিগুলি বজায় রাখে। আমার কনটেস্টেশন পদক্ষেপটি এমআইটি-র অধীনে লাইসেন্সযুক্ত এবং এটি কেবল পরবর্তী লাইসেন্স বিজ্ঞপ্তির ক্ষেত্রে প্রযোজ্য)।

আমি বলছি না এটি একটি সুন্দর সমাধান, তবে এখনও পর্যন্ত এটি প্রয়োগ এবং সমর্থন উভয়েরই অবিশ্বাস্যরকম সহজ সমাধান বলে মনে হচ্ছে।


আমি এটি নির্ভরযোগ্যভাবে সংকলন করতে পেয়েছি এবং এটি সহজ সরল। কাঠামো ব্যবহার করে অ্যাপ্লিকেশনটির কি বিশেষ কোনও কিছুর সাথে লিঙ্ক করা দরকার, বা কমনক্রিপ্টো সর্বদা উপলব্ধ?
কোডিংফ্রেন্ড 1

1
আমি মনে করি Security.frameworkস্বয়ংক্রিয়ভাবে সংযুক্ত হয়ে গেছে (নতুন প্রকল্প শুরু হওয়ার পরে এটি কিছুটা সময় হয়ে যাবে)। যদি আপনি ত্রুটি পান তবে এটি লিঙ্ক করার ফ্রেমওয়ার্ক।
রব নেপিয়ার

এটি সবচেয়ে সহজ সমাধানের মতো বলে মনে হচ্ছে এবং এটি একটি মেশিনে দুর্দান্ত কাজ করে, তবে যখনই আমি অন্য মেশিনে অন্য কাঠামো বা অ্যাপ্লিকেশনটিতে ফ্রেমওয়ার্কটি ব্যবহার করি তখন আমি 'অনুপস্থিত মডিউল' ত্রুটি পাই।
ধনী

2

আমি জানি এটি একটি পুরানো প্রশ্ন। তবে আমি সুইফট প্রকল্পে গ্রন্থাগারটি ব্যবহারের বিকল্প উপায়টি খুঁজে বের করেছি, যাঁরা এই উত্তরগুলিতে প্রবর্তিত কাঠামো আমদানি করতে চান না তাদের পক্ষে সহায়ক হতে পারে।

সুইফ্ট প্রকল্পে, একটি উদ্দেশ্য-সি ব্রিজিং শিরোনাম তৈরি করুন, উদ্দেশ্য-সিতে এনএসডাটা বিভাগ (বা গ্রন্থাগারটি ব্যবহার করার জন্য কাস্টম শ্রেণি) তৈরি করুন। একমাত্র ত্রুটিটি হ'ল আপনাকে উদ্দেশ্যমূলক-সিতে সমস্ত প্রয়োগের কোড লিখতে হবে। উদাহরণ স্বরূপ:

#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সর্বজনীন হতে হবে না)।
রাফেল

তবে এই জিনিসটি ব্যবহার করার জন্য আমার কোন ওএস কাঠামোর সাথে লিঙ্ক করা উচিত? অন্যের মতো নয় - আমাকে একটি ওবজে-সি প্রকল্পে কমনক্রিপ্টো নিয়ে কাজ করতে হবে, এবং এটি একা
ম্যাকোস -10.13

@ মোটিশিশর ১০.৯ বা তার বেশি যে কোনও ওএসকে লিঙ্ক করুন। আমি একই পরিবেশে কাজ করছি এবং এটি দুর্দান্ত কাজ করে।
টেরেন্স

2

আপনার কোকোপডস লাইব্রেরিতে আপনার যদি কমনক্রিপ্টো ব্যবহার করার প্রয়োজন হয় তবে জার্সকোটের উত্তরে আমি কিছু কোকোপডস জাদু যুক্ত করেছি।


1) আপনার পডস্পেক এই লাইন যুক্ত করুন:

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

২) এটি আপনার লাইব্রেরি ফোল্ডারে বা আপনার পছন্দ যেখানেই সংরক্ষণ করুন (তবে সেই অনুযায়ী স্ক্রিপ্ট_ফেজ পরিবর্তন করতে ভুলবেন না ...)

# 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

আমি নিশ্চিত নই যে এক্সকোড 9.2 দিয়ে কিছু পরিবর্তন হয়েছে কিনা তবে এটি অর্জন এখন অনেক সহজ। আমার কেবলমাত্র কাজগুলি হ'ল আমার ফ্রেমওয়ার্ক প্রকল্প ডিরেক্টরিতে "কমনক্রিপ্টো" নামে একটি ফোল্ডার তৈরি করা এবং এর অভ্যন্তরে দুটি ফাইল তৈরি করা, যার মধ্যে একটি "সি সি এইচ" নামে পরিচিত:

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

এবং আর একটি নামক Module.modulemap বলা হয়:

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

(কেন আপনি SDKROOT অঞ্চল থেকে সরাসরি মডিউলম্যাপ ফাইলে হেডার ফাইলগুলি উল্লেখ করতে পারবেন না তা আমি জানি না তবে আমি এটি কাজ করতে পারিনি)

তৃতীয়টি হ'ল "আমদানি পথগুলি" সেটিংসটি খুঁজে পাওয়া এবং $ (SRCROOT) এ সেট করা। আসলে আপনি যদি কমনক্রিপ্টো ফোল্ডারটির অধীনে থাকতে চান তবে যে কোনও ফোল্ডারে এটি সেট করতে পারেন, যদি আপনি এটি মূল স্তরে না চান।

এর পরে আপনার ব্যবহার করা উচিত

import CommonCrypto

যে কোনও সুইফ্ট ফাইল এবং সমস্ত ধরণের / ফাংশন / ইত্যাদিতে। সহজ প্রাপ্য.

যদিও সতর্কতার একটি শব্দ - যদি আপনার অ্যাপ্লিকেশনটি libCommonCrypto (বা libcoreCrypto) ব্যবহার করে তবে কোনও অতি-অত্যাধুনিক হ্যাকারের পক্ষে আপনার অ্যাপ্লিকেশনটিতে একটি ডিবাগার সংযুক্ত করা এবং এই ফাংশনগুলিতে কী কী পাস করা হচ্ছে তা সন্ধান করা এটি খুব সহজ।


0

যদি আপনার নীচের সমস্যাটি থাকে:

ld: -lapple_crypto ঝাঁকুনির জন্য লাইব্রেরি পাওয়া যায় নি: ত্রুটি: প্রস্থান কোড 1 দিয়ে লিঙ্কার কমান্ড ব্যর্থ হয়েছে (অনুরোধ দেখতে -v ব্যবহার করুন)

এক্সকোড 10 এ, সুইফট 4.0। কমনক্রিপ্টো একটি কাঠামোর অংশ।

যোগ

 import CommonCrypto

অপসারণ

  • বিল্ড পর্যায় থেকে লাইব্রেরির সাথে লিঙ্ক বাইনারি থেকে কমনক্রিপ্টো লাইব ফাইল
  • import CommonCrypto ব্রিজিং হেডার থেকে

এটি আমার পক্ষে কাজ করেছিল!


-1

এক্সকোড আপডেট করার পরে আমার ক্ষেত্রেও এটি ঘটেছিল। কোকোপড পুনরায় ইনস্টল করা এবং প্রকল্পটি পরিষ্কার করার মতো আমি যা কিছু করতে পারি তার চেষ্টা করেছি, কিন্তু এটি কার্যকর হয়নি। সিস্টেমটি পুনরায় চালু করার পরে এটি সমাধান হয়ে গেছে ।


-13

এটা খুবই সাধারণ. যোগ

#import <CommonCrypto/CommonCrypto.h>

একটি। এইচ ফাইলে (আপনার প্রকল্পের ব্রিজিং হেডার ফাইল) একটি কনভেনশন হিসাবে আপনি এটিকে আপনার প্রজেক্টনাম-ব্রিজিং-শিরোনাম বলতে পারেন।

তারপরে আপনার প্রোজেক্ট বিল্ড সেটিংসে যান এবং সুইফ্ট সংকলক - কোড জেনারেশন সন্ধান করুন। এর অধীনে, "ব্রিজিং-হে ব্রিজিং শিরোনাম" এন্ট্রিটিতে আপনার ব্রিজিং শিরোনামের নাম যুক্ত করুন।

তুমি করেছ. আপনার সুইফ্ট কোডে কোনও আমদানির প্রয়োজন নেই। এই ব্রিজিং হেডার ফাইলে তালিকাভুক্ত যে কোনও পাবলিক অবজেক্টিভ-সি শিরোনামগুলি সুইফ্টের কাছে দৃশ্যমান হবে।


আপনার পদ্ধতির ত্রুটি ফিরে আসে: ফ্রেমওয়ার্ক লক্ষ্য সহ ব্রিজিং শিরোনামগুলি অসমর্থিত
gorgi93

5
@ gorgi93 ত্রুটির পরামর্শ অনুসারে আপনি কোনও ফ্রেমওয়ার্ক টার্গেটে ব্রিজিং শিরোনাম ব্যবহার করতে পারবেন না। দুর্ভাগ্যক্রমে, একমাত্র বিকল্পটি প্রধান ফ্রেমওয়ার্ক শিরোলেখ ফাইলটিতে রাখা হয়।
চার্লস এ। 23

1
যদি আপনি আসলে এই থ্রেডটির শিরোনামটি লাল করে রাখেন তবে আপনি দেখতে পাবেন যে লোকটি কমনক্রিপ্টো লাইব্রেরিকে একটি সুইফ্ট ফ্রেমওয়ার্কে আমদানি করতে চাইছে। আপনি ফ্রেমওয়ার্কগুলিতে ব্রিজিং শিরোলেখ ব্যবহার করতে পারবেন না এবং আপনি ছাতা শিরোনামে কমনক্রিপ্টো কাঠামো আমদানি করতে পারবেন না।
miken.mkndev
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.