Algo un poco más simple y robusto es crear un objetivo agregado llamado "CommonCryptoModuleMap" con una fase Ejecutar script para generar el mapa del módulo automáticamente y con la ruta correcta de Xcode / SDK:
La fase Ejecutar script debe contener este bash:
# 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
Usar el código de shell y ${SDKROOT}
significa que no tiene que codificar la ruta Xcode.app que puede variar de un sistema a otro, especialmente si usa xcode-select
para cambiar a una versión beta, o está construyendo en un servidor CI donde se instalan múltiples versiones en ubicaciones no estándar. Tampoco necesita codificar el SDK, por lo que debería funcionar para iOS, macOS, etc. Tampoco necesita tener nada en el directorio de origen de su proyecto.
Después de crear este objetivo, haga que su biblioteca / marco dependa de él con un elemento de Dependencias de destino:
Esto asegurará que el mapa del módulo se genere antes de construir su marco.
nota de macOS : si también es compatible macOS
, deberá agregar macosx
a la Supported Platforms
configuración de compilación en el nuevo destino agregado que acaba de crear, de lo contrario no colocará el mapa del módulo en la Debug
carpeta de datos derivados correcta con el resto del productos marco.
A continuación, agregue el directorio principal del mapa del módulo ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
, a la configuración de compilación "Importar rutas" en la sección Swift ( SWIFT_INCLUDE_PATHS
):
Recuerde agregar una $(inherited)
línea si tiene rutas de búsqueda definidas en el proyecto o en el nivel xcconfig.
Eso es todo, ahora deberías poder import CommonCrypto
Actualización para Xcode 10
Xcode 10 ahora viene con un mapa del módulo CommonCrypto que hace innecesaria esta solución alternativa. Si desea admitir Xcode 9 y 10, puede hacer una comprobación en la fase Ejecutar script para ver si el mapa del módulo existe o no, por ejemplo
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