สิ่งที่เรียบง่ายและมีประสิทธิภาพมากกว่าเล็กน้อยคือการสร้างเป้าหมายรวมที่เรียกว่า "CommonCryptoModuleMap" ด้วยเฟส Run Script เพื่อสร้างแผนที่โมดูลโดยอัตโนมัติและด้วยเส้นทาง 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
เพื่อเปลี่ยนเป็นรุ่นเบต้าหรือกำลังสร้างบนเซิร์ฟเวอร์ CI ที่ติดตั้งหลายรุ่น ในสถานที่ที่ไม่ได้มาตรฐาน คุณไม่จำเป็นต้องเขียนโค้ด SDK อย่างหนักดังนั้นจึงควรใช้งานได้กับ iOS, macOS และอื่น ๆ คุณไม่จำเป็นต้องมีสิ่งใดที่อยู่ในไดเรกทอรีต้นทางของโครงการ
หลังจากสร้างเป้าหมายนี้แล้วให้ไลบรารี่ / กรอบงานของคุณขึ้นอยู่กับรายการอ้างอิงเป้าหมาย:
สิ่งนี้จะช่วยให้แน่ใจว่าแผนที่โมดูลถูกสร้างขึ้นก่อนที่จะสร้างกรอบงานของคุณ
macOS note : หากคุณรองรับmacOS
เช่นกันคุณจะต้องเพิ่มmacosx
การSupported Platforms
ตั้งค่าการสร้างในเป้าหมายรวมใหม่ที่คุณเพิ่งสร้างมิฉะนั้นจะไม่ทำให้แผนที่โมดูลในDebug
โฟลเดอร์ข้อมูลที่ได้มาถูกต้องพร้อมกับส่วนที่เหลือของ ผลิตภัณฑ์กรอบ
ถัดไปเพิ่มไดเรกทอรีหลักของโมดูลแผนที่${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
ไปยังการตั้งค่าการสร้าง "เส้นทางที่นำเข้า" ภายใต้ส่วน Swift ( SWIFT_INCLUDE_PATHS
):
อย่าลืมเพิ่ม$(inherited)
บรรทัดหากคุณมีเส้นทางการค้นหาที่กำหนดไว้ในโครงการหรือระดับ xcconfig
เพียงเท่านี้คุณก็ควรจะสามารถ import CommonCrypto
อัพเดทสำหรับ Xcode 10
ตอนนี้ Xcode 10 มาพร้อมกับแผนที่โมดูล CommonCrypto ทำให้ไม่จำเป็นต้องแก้ไขปัญหานี้ หากคุณต้องการสนับสนุนทั้ง Xcode 9 และ 10 คุณสามารถทำการตรวจสอบในเฟส Run Script เพื่อดูว่ามีการแมปโมดูลอยู่หรือไม่เช่น
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