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:
# 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-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 menambahkan macosx
ke Supported Platforms
pengaturan build pada target agregat baru yang baru saja Anda buat, jika tidak, ia tidak akan menempatkan peta modul dalam Debug
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
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