Что-то более простое и надежное - создать цель Aggregate под названием «CommonCryptoModuleMap» с этапом выполнения сценария для автоматического создания карты модуля и с правильным путем Xcode / SDK:
Этап выполнения сценария должен содержать этот bash:
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 и т. Д. Вам также не нужно ничего хранить в исходном каталоге вашего проекта.
После создания этой цели сделайте вашу библиотеку / фреймворк зависимой от нее с помощью элемента Target Dependencies:
Это обеспечит создание карты модуля до создания вашего фреймворка.
Примечание для macOS : если вы также поддерживаете macOS
, вам нужно будет добавить macosx
в Supported Platforms
настройку сборки новую совокупную цель, которую вы только что создали, иначе карта модуля не будет помещена в правильную Debug
папку производных данных с остальной частью каркасные изделия.
Затем добавьте родительский каталог карты модуля в ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
параметр сборки «Import Paths» в разделе 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
fi