Mengimpor CommonCrypto dalam kerangka kerja Swift

184

Bagaimana Anda mengimpor CommonCryptodalam kerangka kerja Swift untuk iOS?

Saya mengerti cara menggunakan CommonCryptodi aplikasi Swift: Anda menambah #import <CommonCrypto/CommonCrypto.h>header penghubung. Namun, kerangka kerja Swift tidak mendukung bridging header. The dokumentasi mengatakan:

Anda dapat mengimpor kerangka kerja eksternal yang memiliki basis kode Objective-C murni, basis kode Swift murni, atau basis kode bahasa campuran. Proses untuk mengimpor kerangka kerja eksternal adalah sama apakah kerangka kerja ditulis dalam satu bahasa atau berisi file dari kedua bahasa. Saat Anda mengimpor kerangka kerja eksternal, pastikan pengaturan Tentukan modul untuk kerangka kerja yang Anda impor diatur ke Ya.

Anda dapat mengimpor kerangka kerja ke file Swift apa pun dalam target yang berbeda menggunakan sintaks berikut:

import FrameworkName

Sayangnya, impor CommonCryptotidak berfungsi. Juga tidak menambah #import <CommonCrypto/CommonCrypto.h>header payung.

hpique
sumber
CommonCrypto adalah kerangka kerja berbasis C, bukan kerangka kerja Objective-C.
rmaddy
1
@rmaddy Objective-C adalah superset C. Apakah Anda mengatakan kami tidak dapat menggunakan CommonCrypto dari Swift?
hpique
4
@rmaddy Saya baru saja berhasil membuat CommonCrypto bekerja dengan menggunakan peta modul. Saya akan memoles solusinya dan mempostingnya nanti hari ini.
hpique
jika Anda merasa nyaman, dan apa yang Anda cari sudah diterapkan, Anda dapat mencoba CryptoSwift
Marcin
1
Apple baru saja membuka CommonCrypto yang bersumber. Mungkin kita bisa menjalankannya jika kita memiliki sumbernya.
eyeballz

Jawaban:

137

Sesuatu yang sedikit lebih sederhana dan lebih kuat adalah membuat target Agregat yang disebut "CommonCryptoModuleMap" dengan fase Run Script untuk menghasilkan peta modul secara otomatis dan dengan jalur Xcode / SDK yang benar:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Fase Run Script harus mengandung bash ini:

# 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

Menggunakan kode shell dan ${SDKROOT}berarti Anda tidak perlu membuat kode jalur Xcode.app yang sulit yang dapat memvariasikan sistem-ke-sistem, terutama jika Anda menggunakan xcode-selectuntuk beralih ke versi beta, atau sedang membangun pada server CI di mana banyak versi diinstal di lokasi yang tidak standar. Anda juga tidak perlu membuat kode SDK jadi ini harus bekerja untuk iOS, macOS, dll. Anda juga tidak perlu memiliki apa pun yang duduk di direktori sumber proyek Anda.

Setelah membuat target ini, buat perpustakaan / kerangka kerja Anda bergantung padanya dengan item Ketergantungan Target:

masukkan deskripsi gambar di sini

Ini akan memastikan peta modul dihasilkan sebelum kerangka kerja Anda dibuat.

catatan macOS : Jika Anda mendukung macOSjuga, Anda harus menambahkan macosxke Supported Platformspengaturan build pada target agregat baru yang baru saja Anda buat, jika tidak, ia tidak akan menempatkan peta modul dalam Debugfolder data turunan yang benar dengan sisa dari produk kerangka kerja.

masukkan deskripsi gambar di sini

Selanjutnya, tambahkan direktori induk peta modul ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap,, ke pengaturan build "Import Paths" di bawah bagian Swift ( SWIFT_INCLUDE_PATHS):

masukkan deskripsi gambar di sini

Ingatlah untuk menambahkan $(inherited)baris jika Anda memiliki jalur pencarian yang ditentukan pada level proyek atau xcconfig.

Itu saja, Anda sekarang harus bisa import CommonCrypto

Pembaruan untuk Xcode 10

Xcode 10 sekarang dikirimkan dengan peta modul CommonCrypto yang menjadikan penyelesaian ini tidak perlu. Jika Anda ingin mendukung Xcode 9 dan 10, Anda dapat melakukan pemeriksaan pada fase Run Script untuk melihat apakah peta modul ada atau tidak, misalnya

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
Mike Weller
sumber
8
Jawaban ini harus ada di atas. Sederhana dan elegan
Abdullah Saeed
1
Terlambat untuk permainan yang satu ini - tetapi ini harus menjadi jawaban yang dipilih. Ini sederhana dan lebih mudah bagi pengembang lain yang mengerjakan proyek yang sama untuk melihat persyaratannya.
fatuous.logic
1
Jawaban yang bagus Terima kasih!
Klaus Busse
1
Jika saya melakukan ini dalam .framework saya, haruskah saya melakukan hal yang sama dalam proyek di mana saya memasukkan kerangka kerja ini?
Ravi Kiran
2
@IanDundas saya memperbarui kode di atas dengan perbaikan untuk masalah kompilasi ulang serta perbaikan untuk menggunakan ini di macOS
iwasrobbed
91

Anda sebenarnya dapat membangun solusi yang "hanya berfungsi" (tidak perlu menyalin module.modulemap dan SWIFT_INCLUDE_PATHSpengaturan ke proyek Anda, seperti yang dipersyaratkan oleh solusi lain di sini), tetapi itu memang mengharuskan Anda untuk membuat kerangka kerja / modul yang Anda inginkan. akan mengimpor ke dalam kerangka kerja Anda dengan tepat. Kami juga bisa memastikan bekerja terlepas dari platform ( iphoneos, iphonesimulator, atau macosx).

  1. Tambahkan target kerangka kerja baru ke proyek Anda dan beri nama setelah pustaka sistem, misalnya , "CommonCrypto". (Anda dapat menghapus header payung, CommonCrypto.h .)

  2. Tambahkan File Pengaturan Konfigurasi baru dan beri nama, misalnya , "CommonCrypto.xcconfig". (Jangan periksa target Anda untuk dimasukkan.) Isi dengan yang berikut ini:

    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. Buat tiga file peta modul referensi, di atas, dan isi dengan yang berikut:

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

    (Ganti "Xcode.app" dengan "Xcode-beta.app" jika Anda menjalankan versi beta. Ganti 10.11dengan OSKK Anda saat ini jika tidak menjalankan El Capitan.)

  4. Pada tab Info pada pengaturan proyek Anda, di bawah Konfigurasi , atur konfigurasi Debug dan Release dari CommonCrypto ke CommonCrypto (merujuk CommonCrypto.xcconfig ).

  5. Pada tab Bangun fase target kerangka kerja Anda , tambahkan kerangka CommonCrypto ke Ketergantungan Target . Selain itu tambahkan libcommonCrypto.dylib ke fase pembuatan Link Binary With Libraries .

  6. Pilih CommonCrypto.framework dalam Produk dan pastikan Keanggotaan Targetnya untuk pembungkus Anda diatur ke Opsional .

Anda sekarang seharusnya bisa membangun, menjalankan dan import CommonCryptodalam kerangka pembungkus Anda.

Sebagai contoh, lihat bagaimana SQLite.swift menggunakan dummy sqlite3.framework .

stephencelis
sumber
4
Bekerja untuk saya tanpa langkah (5). Dengan itu saya mendapatkan kesalahan build: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
Luar biasa! Digunakan ini untuk membuat github.com/soffes/Crypto saya tidak perlu menautkan System.framework. Perlu dicatat, Anda harus membuat kerangka pembungkus terpisah untuk Mac dan iOS jika kerangka kerja Anda adalah lintas platform.
Sam Soffes
32
Bagaimana atau di mana orang mengetahui hal-hal seperti ini?
Hola
5
Hanya perlu dijelaskan bahwa Anda harus memilih Objective-C sebagai bahasa pada langkah 1. Ini mudah diabaikan. Juga, mungkin karena saya tidak memiliki .dylib, saya perlu menambahkan .framework pada langkah 5.
Teo Sartori
7
ini mengerikan. Saya memiliki kebun binatang kode X masing-masing rusak dengan cara yang berbeda dan memiliki jalur absolut ke header di semua tempat adalah muntah muntah. Ada yang salah di cupertino, atau setidaknya dengan siapa pun yang bertanggung jawab atas kekacauan modulemap ini
Anton Tropashko
82

Saya menemukan proyek GitHub yang berhasil menggunakan CommonCrypto dalam kerangka kerja Swift: SHA256-Swift . Juga, artikel ini tentang masalah yang sama dengan sqlite3 bermanfaat.

Berdasarkan hal di atas, langkah-langkahnya adalah:

1) Buat CommonCryptodirektori di dalam direktori proyek. Di dalam, buat module.mapfile. Peta modul akan memungkinkan kita untuk menggunakan perpustakaan CommonCrypto sebagai modul dalam Swift. Isinya adalah:

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) Dalam Pengaturan Bangun, di dalam Swift Compiler - Jalur Pencarian , tambahkan CommonCryptodirektori ke Jalur Impor ( SWIFT_INCLUDE_PATHS).

Pengaturan Bangun

3) Akhirnya, impor CommonCrypto ke dalam file Swift Anda seperti modul lainnya. Sebagai contoh:

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

Keterbatasan

Menggunakan kerangka kerja kustom di proyek lain gagal pada waktu kompilasi dengan kesalahan missing required module 'CommonCrypto'. Ini karena modul CommonCrypto tampaknya tidak disertakan dengan kerangka kerja kustom. Solusinya adalah mengulangi langkah 2 (pengaturan Import Paths) dalam proyek yang menggunakan kerangka kerja.

Peta modul bukan platform independen (saat ini menunjuk ke platform tertentu, iOS 8 Simulator). Saya tidak tahu cara membuat jalur tajuk relatif terhadap platform saat ini.

Pembaruan untuk iOS 8 <= Kami harus menghapus tautan baris "CommonCrypto" , untuk mendapatkan kompilasi yang berhasil.

UPDATE / EDIT

Saya terus mendapatkan galat build berikut:

ld: library tidak ditemukan untuk -lCommonCrypto untuk arsitektur x86_64 clang: error: perintah linker gagal dengan kode keluar 1 (gunakan -v untuk melihat doa)

Kecuali saya menghapus baris link "CommonCrypto"dari module.mapfile yang saya buat. Setelah saya menghapus baris ini, itu dibangun ok.

hpique
sumber
30
Astaga, Apple tentu ingin membuat segalanya menjadi sulit. Apakah itu akan membunuh Swifties untuk membiarkan kami mengimpor file / kerangka kerja tanpa harus melalui semua BS ini?
zaph
4
Ini menyebalkan karena $SDKROOTvariabel seharusnya memungkinkan Anda platform jalur agnostik, tapi saya tidak tahu bagaimana untuk sampai ke sana di Swift.
danimal
2
Bagi saya itu tidak berfungsi sampai saya menghapus link "CommonCrypto"file module.map.
Teo Sartori
1
Adakah yang bisa mengkonfirmasi ini bekerja pada Xcode 7.3? Solusi ini berhenti bekerja untuk saya setelah pembaruan.
Nikita Kukushkin
1
Koreksi: berfungsi dengan baik ketika saya membangun untuk simulator, tetapi gagal @ menghubungkan ketika saya membangun untuk perangkat iOS 9.3 dengan "ld: perpustakaan tidak ditemukan untuk -lCommonCrypto untuk arsitektur arm64"
Nikita Kukushkin
50

Jawaban ini membahas cara membuatnya bekerja di dalam kerangka kerja, dan dengan Cocoapods dan Carthage

๐ŸŸ pendekatan modulemap

Saya menggunakan modulemappembungkus saya di sekitar CommonCrypto https://github.com/onmyway133/arcane , https://github.com/onmyway133/Reindeer

Untuk yang mendapatkannya header not found, silakan lihat https://github.com/onmyway133/Arcane/issues/4 atau jalankanxcode-select --install

  • Buat folder yang CCommonCryptoberisimodule.modulemap

      module CCommonCrypto {
        header "/usr/include/CommonCrypto/CommonCrypto.h"
        export *
      }
  • Pergi ke Pengaturan Dibangun -> Impor Jalur

      ${SRCROOT}/Sources/CCommonCrypto

๐ŸŒณ Cocoapods dengan pendekatan modulemap

๐Ÿ˜ pendekatan tajuk publik

๐Ÿ Cocoapods dengan pendekatan tajuk publik

๐Ÿ Posting terkait yang menarik

onmyway133
sumber
1
Wow! Yang mengejutkan saya, jalur header dari pendekatan atas (membuat file module.modulemap) bekerja sangat baik ketika file modulemap sebelumnya telah menyebabkan banyak masalah. Saya telah berjuang dengan ini untuk sementara waktu menggunakan file module.modulemap dengan path absolut ke /CommonCrypto/CommonCrypto.hdalam Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS...., yang membutuhkan modifikasi manual untuk orang-orang yang mengganti nama XCode. Mengalihkan garis itu untuk melihat "/usr/include/CommonCrypto/CommonCrypto.h"tampaknya bekerja dengan baik untuk tim dengan beberapa versi XCode. Terima kasih banyak!
Natalia
3
Saya membuat pod, saya mengatur SWIFT_INCLUDE_PATHS dan preserve_paths. Ketika saya menjalankan pod lib lint, tetapi build gagal dengan kesalahan: tidak ada modul 'CommonCrypto'. Bagaimana saya bisa mengatasinya.
Klein Mioke
1
Tidak terkait dengan masalah tetapi saya suka menggunakan emoji sebagai peluru! ๐Ÿ˜Š
Fomentia
2
@ onmyway133 Menggunakan pod pengembangan lokal berfungsi jika Anda menggantinya $(PODS_ROOT)/CommonCryptoSwift/Sources/CCommonCryptodengan $(PODS_TARGET_SRCROOT)/Sources/CCommonCrypto. PODS_TARGET_SRCROOTdiatur dengan benar untuk pod lokal.
Orkhan Alikhanov
Jawaban yang bagus, menyelamatkan hidup saya! Terima kasih satu juta
Hassan Shahbazi
45

Kabar baik! Swift 4.2 (Xcode 10) akhirnya menyediakan CommonCrypto!

Cukup tambahkan import CommonCryptofile cepat Anda.

mxcl
sumber
Kabar baik! Bisakah Anda menambahkan tautan ke dokumentasi?
Kryลกtof Matฤ›j
Saya tidak memiliki tautan ke dokumentasi, saya menemukan ini ketika mencoba untuk mengkompilasi proyek di mana saya memiliki salah satu solusi di sini dengan Xcode 10. Ia mengeluh bahwa ia dapat menemukan dua CommonCryptomodul, sehingga mencurigai Apple sekarang asalkan saya menghapus solusi saya dan lihat! Itu benar. Saya tweet tentang hal itu dan seorang insinyur Apple menjawab mengkonfirmasi bahwa itu dimaksudkan.
mxcl
1
App store hanya menampilkan saya 9.4.7 sebagai pembaruan yang tersedia, bagaimana Anda mendapat Xcode 10?
Hammad Tariq
1
Ini dalam versi beta, seperti yang dikatakan oleh pencarian Google yang sepele.
mxcl
1
@SomoyDasGupta ya. Hapus saja impor sebelumnya, dan kompilasi lagi. Dengan kata lain, Anda tidak perlu melakukan langkah-langkah dari jawaban MikeWeller
ICE DINGIN
7

PERINGATAN: iTunesConnect dapat menolak aplikasi yang menggunakan metode ini.


Anggota baru di tim saya secara tidak sengaja memecahkan solusi yang diberikan oleh salah satu jawaban teratas, jadi saya memutuskan untuk mengkonsolidasikannya dalam proyek pembungkus kecil yang disebut CommonCryptoModule . Anda dapat menginstalnya secara manual atau melalui Cocoapods:

pod 'CommonCryptoModule', '~> 1.0.2'

Kemudian, yang harus Anda lakukan adalah mengimpor modul di tempat yang Anda butuhkan CommonCrypto, seperti:

import CommonCryptoModule

Semoga orang lain menemukan ini berguna.

Nikita Kukushkin
sumber
Peringatan: Aplikasi Anda akan ditolak jika Anda menggunakan metode ini!
Segabond
Yap, kami juga ditolak, sangat aneh, karena kami mengunggah tanpa masalah selama beberapa bulan menggunakan metode ini.
Nikita Kukushkin
5

Saya pikir saya memiliki peningkatan pada karya Mike Weller yang sangat baik.

Tambahkan fase Run Script sebelum Compile Sources fase yang mengandung bash ini:

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

Script ini membangun kerangka tulang kosong dengan module.map di tempat yang benar dan kemudian bergantung pada pencarian otomatis Xcode untuk BUILT_PRODUCTS_DIR kerangka kerja .

Saya menautkan folder asli CommonCrypto sebagai folder Header kerangka kerja sehingga hasilnya juga berfungsi untuk proyek Objective C.

jjrscott
sumber
Lihat jawaban dvdblk untuk peningkatan yang mencakup penggunaan dalam CocoaPods.
jjrscott
5

Bagi siapa pun yang menggunakan swift 4.2 dengan Xcode 10 :

Modul CommonCrypto sekarang disediakan oleh sistem, sehingga Anda dapat langsung mengimpornya seperti kerangka kerja sistem lainnya.

import CommonCrypto
kubrick G
sumber
Duplikat jawaban @ mxcl: stackoverflow.com/a/50690346/9988514
Rainer Schwarz
4

@mogstad telah berbaik hati untuk membungkus solusi @stephencelis dalam Cocoapod:

pod 'libCommonCrypto'

Pod lain yang tersedia tidak berfungsi untuk saya.

Jacob Jennings
sumber
4

Solusi modulemap bisa bagus, dan kuat terhadap perubahan SDK, tapi saya merasa canggung untuk digunakan dalam praktik, dan tidak dapat diandalkan seperti yang saya inginkan saat membagikan sesuatu kepada orang lain. Untuk membuatnya lebih mudah, saya pergi dengan cara yang berbeda:

Cukup salin tajuknya.

Saya tahu, rapuh. Tetapi Apple hampir tidak pernah membuat perubahan signifikan pada CommonCrypto dan saya hidup dalam mimpi bahwa mereka tidak akan mengubahnya dengan cara yang signifikan tanpa akhirnya membuat CommonCrypto menjadi header modular.

Dengan "salin tajuk" Maksud saya "memotong dan menempelkan semua tajuk yang Anda butuhkan menjadi satu tajuk besar dalam proyek Anda seperti yang akan dilakukan oleh preprosesor." Sebagai contoh ini yang bisa Anda salin atau adaptasi, lihat RNCryptor.h .

Perhatikan bahwa semua file ini dilisensikan di bawah APSL 2.0, dan pendekatan ini sengaja mempertahankan pemberitahuan hak cipta dan lisensi. Langkah penggabungan saya dilisensikan di bawah MIT, dan itu hanya berlaku hingga pemberitahuan lisensi berikutnya).

Saya tidak mengatakan ini adalah solusi yang indah, tetapi sejauh ini tampaknya telah menjadi solusi yang sangat sederhana baik untuk implementasi maupun dukungan.

Rob Napier
sumber
Saya menemukan ini untuk dikompilasi dengan andal dan sederhana. Apakah aplikasi yang menggunakan kerangka kerja harus terhubung ke sesuatu yang istimewa, atau apakah CommonCrypto selalu tersedia?
codingFriend1
1
Saya pikir Security.frameworksecara otomatis ditautkan (butuh sedikit waktu sejak memulai proyek baru). Jika Anda mendapatkan kesalahan, itulah kerangka untuk ditautkan.
Rob Napier
Ini memang tampak seperti solusi paling sederhana dan bekerja sangat baik pada satu mesin, tetapi setiap kali saya menggunakan kerangka kerja di kerangka lain, atau aplikasi, pada mesin lain saya mendapatkan kesalahan 'modul hilang'.
richever
2

Saya tahu ini adalah pertanyaan lama. Tetapi saya menemukan cara alternatif untuk menggunakan perpustakaan di proyek Swift, yang mungkin bermanfaat bagi mereka yang tidak ingin mengimpor kerangka kerja yang diperkenalkan dalam jawaban ini.

Di proyek Swift, buat header bridging Objective-C, buat kategori NSData (atau kelas kustom yang menggunakan perpustakaan) di Objective-C. Satu-satunya kelemahan adalah bahwa Anda harus menulis semua kode implementasi di Objective-C. Sebagai contoh:

#import "NSData+NSDataEncryptionExtension.h"
#import <CommonCrypto/CommonCryptor.h>

@implementation NSData (NSDataEncryptionExtension)
- (NSData *)AES256EncryptWithKey:(NSString *)key {
    //do something
}

- (NSData *)AES256DecryptWithKey:(NSString *)key {
//do something
}

Dan kemudian di header bridging objektif-c Anda, tambahkan ini

#import "NSData+NSDataEncryptionExtension.h"

Dan kemudian di kelas Swift melakukan hal serupa:

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

Ini berfungsi seperti yang diharapkan.

Terence
sumber
Ini berfungsi sangat lancar, dan bahkan memungkinkan Anda untuk menjaga internal ( NSData+NSDataEncryptionExtension.htidak harus publik).
Raphael
Tapi kerangka OS apa yang harus saya hubungkan, untuk menggunakan benda ini? Tidak seperti yang lain - saya harus bekerja dengan CommonCrypto dalam proyek Obj-C, dan itu saja rusak pada Xcode 9 dengan MacOS-10.13 SDK
Motti Shneor
@MottiShneor Tautkan OS apa pun dari 10.9 atau lebih tinggi. Saya bekerja di lingkungan yang sama dan berfungsi dengan baik.
Terence
2

Saya telah menambahkan beberapa sulap cocoapods ke jawaban jjrscott jika Anda perlu menggunakan CommonCrypto di perpustakaan cocoapods Anda.


1) Tambahkan baris ini ke podspec Anda:

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

2) Simpan ini di folder perpustakaan Anda atau di mana pun Anda suka (namun jangan lupa untuk mengubah script_phase yang sesuai ...)

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

Bekerja seperti pesona :)

dvdblk
sumber
Bisakah Anda memberikan proyek demo atau kerangka kerja yang sama bersama dengan file spesifikasi pod?
Gowtham
0

Saya tidak yakin apakah ada yang berubah dengan Xcode 9.2 tetapi sekarang jauh lebih mudah untuk mencapai ini. Satu-satunya hal yang harus saya lakukan adalah membuat folder bernama "CommonCrypto" di direktori proyek kerangka kerja saya dan membuat dua file di dalamnya, satu disebut "cc.h" sebagai berikut:

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

Dan modul.modulemap lain yang disebut:

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

(Saya tidak tahu mengapa Anda tidak bisa mereferensikan file header dari area SDKROOT langsung dalam file modulemap tapi saya tidak bisa membuatnya berfungsi)

Yang ketiga adalah menemukan pengaturan "Import Paths" dan set ke $ (SRCROOT). Bahkan Anda dapat mengaturnya ke folder apa pun yang Anda inginkan folder CommonCrypto berada di bawah, jika Anda tidak menginginkannya di tingkat root.

Setelah ini, Anda harus dapat menggunakannya

import CommonCrypto

Dalam setiap file cepat dan semua jenis / fungsi / dll. tersedia.

Namun, kata peringatan - jika aplikasi Anda menggunakan libCommonCrypto (atau libcoreCrypto), sangat mudah bagi peretas yang tidak terlalu canggih untuk melampirkan debugger ke aplikasi Anda dan mencari tahu kunci apa yang sedang diteruskan ke fungsi-fungsi ini.

Dylan Nicholson
sumber
0

Jika Anda memiliki masalah di bawah ini:

ld: library tidak ditemukan untuk -lapple_crypto clang: error: perintah linker gagal dengan kode keluar 1 (gunakan -v untuk melihat doa)

Dalam Xcode 10, Swift 4.0. CommonCrypto adalah bagian dari framework.

Menambahkan

 import CommonCrypto

Menghapus

  • File lib CommonCrpto dari tautan biner dengan pustaka dari fase Build
  • import CommonCrypto dari Bridging header

Ini berhasil untuk saya!

SKSN
sumber
-1

Itu terjadi sama dengan saya setelah memperbarui Xcode. Saya mencoba semua yang bisa saya lakukan seperti menginstal ulang cocoapods dan membersihkan proyek, tetapi tidak berhasil. Sekarang sudah terpecahkan setelah restart sistem.

Joey
sumber
-13

Ini sangat sederhana. Menambahkan

#import <CommonCrypto/CommonCrypto.h>

ke file .h (file header bridging proyek Anda). Sebagai sebuah konvensi, Anda dapat menyebutnya YourProjectName-Bridging-Header.h.

Lalu pergi ke Pengaturan Bangun proyek Anda dan cari Swift Compiler - Pembuatan Kode. Di bawahnya, tambahkan nama header bridging Anda ke entri "Objetive-C Bridging Header".

Kamu sudah selesai. Tidak diperlukan impor dalam kode Swift Anda. Setiap header Objective-C publik yang tercantum dalam file header bridging ini akan terlihat oleh Swift.

Juanjo Conti
sumber
metode Anda mengembalikan kesalahan: menggunakan header penghubung dengan target kerangka kerja tidak didukung
gorgi93
5
@ gorgi93 Anda tidak dapat menggunakan header penghubung dalam target kerangka kerja, seperti yang disarankan oleh kesalahan. Satu-satunya pilihan adalah meletakkannya di file header framework utama, sayangnya.
Charles A.
1
Jika Anda benar-benar merah judul utas ini, Anda akan melihat bahwa orang itu ingin mengimpor perpustakaan CommonCrypto ke kerangka kerja Swift. Anda tidak bisa menggunakan menjembatani header dalam kerangka kerja, dan Anda tidak bisa mengimpor kerangka CommonCrypto ke header payung.
miken.mkndev