Дещо трохи простішим і надійнішим є створення об'єднаної цілі під назвою "CommonCryptoModuleMap" з фазою Run Script для автоматичного генерування карти модуля з правильним трактом Xcode / SDK:
Етап Run Script повинен містити цей баш:
# 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 : Якщо ви також підтримуєте 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, ви можете зробити перевірку на етапі Запуск сценарію, щоб побачити, чи існує карта модуля чи ні, наприклад
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