Một cái gì đó đơn giản và mạnh mẽ hơn một chút là tạo một mục tiêu Tổng hợp có tên là "CommonCryptoModuleMap" với giai đoạn Run Script để tự động tạo bản đồ mô-đun và với đường dẫn Xcode / SDK chính xác:
Giai đoạn Run Script sẽ chứa bash này:
# 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
Sử dụng mã shell và ${SDKROOT}
có nghĩa là bạn không phải mã cứng đường dẫn Xcode.app có thể thay đổi hệ thống này sang hệ thống khác, đặc biệt nếu bạn sử dụng xcode-select
để chuyển sang phiên bản beta hoặc đang xây dựng trên máy chủ CI có cài đặt nhiều phiên bản ở những vị trí không chuẩn. Bạn cũng không cần mã cứng SDK để nó hoạt động cho iOS, macOS, v.v. Bạn cũng không cần phải có bất cứ thứ gì trong thư mục nguồn của dự án.
Sau khi tạo mục tiêu này, hãy làm cho thư viện / khung của bạn phụ thuộc vào mục đó với mục Phụ thuộc mục tiêu:
Điều này sẽ đảm bảo bản đồ mô-đun được tạo trước khi khung của bạn được xây dựng.
macOS lưu ý : Nếu bạn macOS
cũng hỗ trợ , bạn sẽ cần thêm macosx
vào Supported Platforms
cài đặt bản dựng trên mục tiêu tổng hợp mới mà bạn vừa tạo, nếu không, nó sẽ không đặt bản đồ mô-đun vào Debug
thư mục dữ liệu dẫn xuất chính xác với phần còn lại của khung sản phẩm.
Tiếp theo, thêm thư mục mẹ của sơ đồ mô-đun ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
, vào cài đặt xây dựng "Nhập đường dẫn" trong phần Swift ( SWIFT_INCLUDE_PATHS
):
Hãy nhớ thêm một $(inherited)
dòng nếu bạn có các đường dẫn tìm kiếm được xác định ở cấp độ dự án hoặc xcconfig.
Đó là nó, bây giờ bạn có thể import CommonCrypto
Cập nhật cho Xcode 10
Xcode 10 hiện có một bản đồ mô-đun CommonCrypto khiến cho cách giải quyết này không cần thiết. Nếu bạn muốn hỗ trợ cả Xcode 9 và 10, bạn có thể thực hiện kiểm tra trong giai đoạn Run Script để xem bản đồ mô-đun có tồn tại hay không, ví dụ:
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