Bagaimana Anda mengimpor CommonCrypto
dalam kerangka kerja Swift untuk iOS?
Saya mengerti cara menggunakan CommonCrypto
di 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 CommonCrypto
tidak berfungsi. Juga tidak menambah #import <CommonCrypto/CommonCrypto.h>
header payung.
sumber
Jawaban:
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:
Fase Run Script harus mengandung bash ini:
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 menggunakanxcode-select
untuk 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:
Ini akan memastikan peta modul dihasilkan sebelum kerangka kerja Anda dibuat.
catatan macOS : Jika Anda mendukung
macOS
juga, Anda harus menambahkanmacosx
keSupported Platforms
pengaturan build pada target agregat baru yang baru saja Anda buat, jika tidak, ia tidak akan menempatkan peta modul dalamDebug
folder data turunan yang benar dengan sisa dari produk kerangka kerja.Selanjutnya, tambahkan direktori induk peta modul
${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
,, ke pengaturan build "Import Paths" di bawah bagian Swift (SWIFT_INCLUDE_PATHS
):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
sumber
Anda sebenarnya dapat membangun solusi yang "hanya berfungsi" (tidak perlu menyalin module.modulemap dan
SWIFT_INCLUDE_PATHS
pengaturan 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
, ataumacosx
).Tambahkan target kerangka kerja baru ke proyek Anda dan beri nama setelah pustaka sistem, misalnya , "CommonCrypto". (Anda dapat menghapus header payung, CommonCrypto.h .)
Tambahkan File Pengaturan Konfigurasi baru dan beri nama, misalnya , "CommonCrypto.xcconfig". (Jangan periksa target Anda untuk dimasukkan.) Isi dengan yang berikut ini:
Buat tiga file peta modul referensi, di atas, dan isi dengan yang berikut:
iphoneos.modulemap
iphonesimulator.modulemap
macosx.modulemap
(Ganti "Xcode.app" dengan "Xcode-beta.app" jika Anda menjalankan versi beta. Ganti
10.11
dengan OSKK Anda saat ini jika tidak menjalankan El Capitan.)Pada tab Info pada pengaturan proyek Anda, di bawah Konfigurasi , atur konfigurasi Debug dan Release dari CommonCrypto ke CommonCrypto (merujuk CommonCrypto.xcconfig ).
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 .
Pilih CommonCrypto.framework dalam Produk dan pastikan Keanggotaan Targetnya untuk pembungkus Anda diatur ke Opsional .
Anda sekarang seharusnya bisa membangun, menjalankan dan
import CommonCrypto
dalam kerangka pembungkus Anda.Sebagai contoh, lihat bagaimana SQLite.swift menggunakan dummy sqlite3.framework .
sumber
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
System.framework
. Perlu dicatat, Anda harus membuat kerangka pembungkus terpisah untuk Mac dan iOS jika kerangka kerja Anda adalah lintas platform.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
CommonCrypto
direktori di dalam direktori proyek. Di dalam, buatmodule.map
file. Peta modul akan memungkinkan kita untuk menggunakan perpustakaan CommonCrypto sebagai modul dalam Swift. Isinya adalah:2) Dalam Pengaturan Bangun, di dalam Swift Compiler - Jalur Pencarian , tambahkan
CommonCrypto
direktori ke Jalur Impor (SWIFT_INCLUDE_PATHS
).3) Akhirnya, impor CommonCrypto ke dalam file Swift Anda seperti modul lainnya. Sebagai contoh:
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 (pengaturanImport 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:
Kecuali saya menghapus baris
link "CommonCrypto"
darimodule.map
file yang saya buat. Setelah saya menghapus baris ini, itu dibangun ok.sumber
$SDKROOT
variabel seharusnya memungkinkan Anda platform jalur agnostik, tapi saya tidak tahu bagaimana untuk sampai ke sana di Swift.link "CommonCrypto"
file module.map.Jawaban ini membahas cara membuatnya bekerja di dalam kerangka kerja, dan dengan Cocoapods dan Carthage
๐ pendekatan modulemap
Saya menggunakan
modulemap
pembungkus saya di sekitar CommonCrypto https://github.com/onmyway133/arcane , https://github.com/onmyway133/ReindeerUntuk yang mendapatkannya
header not found
, silakan lihat https://github.com/onmyway133/Arcane/issues/4 atau jalankanxcode-select --install
Buat folder yang
CCommonCrypto
berisimodule.modulemap
Pergi ke Pengaturan Dibangun -> Impor Jalur
๐ณ Cocoapods dengan pendekatan modulemap
Ini adalah podspec https://github.com/onmyway133/Arcane/blob/master/Arcane.podspec
Menggunakan
module_map
tidak berfungsi, lihat https://github.com/CocoaPods/CocoaPods/issues/5271Menggunakan Pod Pengembangan Lokal dengan
path
tidak berfungsi, lihat https://github.com/CocoaPods/CocoaPods/issues/809Itu sebabnya Anda melihat bahwa Contoh Podfile saya https://github.com/onmyway133/CommonCrypto.swift/blob/master/Example/CommonCryptoSwiftDemo/Podfile menunjuk ke git repo
๐ pendekatan tajuk publik
Ji adalah pembungkus di sekitar libxml2, dan menggunakan pendekatan header publik
Ini memiliki file header https://github.com/honghaoz/Ji/blob/master/Source/Ji.h dengan
Target Membership
set kePublic
Ini memiliki daftar file header untuk libxml2 https://github.com/honghaoz/Ji/tree/master/Source/Ji-libxml
Ini memiliki Pengaturan Bangun -> Jalur Pencarian Header
Ini memiliki Pengaturan Bangun -> Bendera Penghubung Lainnya
๐ Cocoapods dengan pendekatan tajuk publik
Lihatlah podspec https://github.com/honghaoz/Ji/blob/master/Ji.podspec
๐ Posting terkait yang menarik
sumber
/CommonCrypto/CommonCrypto.h
dalamApplications/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!pod lib lint
, tetapi build gagal dengan kesalahan: tidak ada modul 'CommonCrypto'. Bagaimana saya bisa mengatasinya.$(PODS_ROOT)/CommonCryptoSwift/Sources/CCommonCrypto
dengan$(PODS_TARGET_SRCROOT)/Sources/CCommonCrypto
.PODS_TARGET_SRCROOT
diatur dengan benar untuk pod lokal.Kabar baik! Swift 4.2 (Xcode 10) akhirnya menyediakan CommonCrypto!
Cukup tambahkan
import CommonCrypto
file cepat Anda.sumber
CommonCrypto
modul, 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.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:
Kemudian, yang harus Anda lakukan adalah mengimpor modul di tempat yang Anda butuhkan
CommonCrypto
, seperti:Semoga orang lain menemukan ini berguna.
sumber
Saya pikir saya memiliki peningkatan pada karya Mike Weller yang sangat baik.
Tambahkan fase Run Script sebelum
Compile Sources
fase yang mengandung bash ini: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.
sumber
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.
sumber
@mogstad telah berbaik hati untuk membungkus solusi @stephencelis dalam Cocoapod:
pod 'libCommonCrypto'
Pod lain yang tersedia tidak berfungsi untuk saya.
sumber
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.
sumber
Security.framework
secara otomatis ditautkan (butuh sedikit waktu sejak memulai proyek baru). Jika Anda mendapatkan kesalahan, itulah kerangka untuk ditautkan.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:
Dan kemudian di header bridging objektif-c Anda, tambahkan ini
Dan kemudian di kelas Swift melakukan hal serupa:
Ini berfungsi seperti yang diharapkan.
sumber
NSData+NSDataEncryptionExtension.h
tidak harus publik).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:
2) Simpan ini di folder perpustakaan Anda atau di mana pun Anda suka (namun jangan lupa untuk mengubah script_phase yang sesuai ...)
Bekerja seperti pesona :)
sumber
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:
Dan modul.modulemap lain yang disebut:
(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
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.
sumber
Jika Anda memiliki masalah di bawah ini:
Dalam Xcode 10, Swift 4.0. CommonCrypto adalah bagian dari framework.
Menambahkan
Menghapus
import CommonCrypto
dari Bridging headerIni berhasil untuk saya!
sumber
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.
sumber
Ini sangat sederhana. Menambahkan
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.
sumber