Qualcosa di un po 'più semplice e robusto è creare un target aggregato chiamato "CommonCryptoModuleMap" con una fase Run Script per generare automaticamente la mappa del modulo e con il percorso Xcode / SDK corretto:
La fase Run Script dovrebbe contenere questo 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
L'uso del codice shell e ${SDKROOT}
significa che non è necessario codificare il percorso Xcode.app che può variare da sistema a sistema, specialmente se si utilizza xcode-select
per passare a una versione beta o si sta costruendo su un server CI in cui sono installate più versioni in posizioni non standard. Inoltre, non è necessario codificare l'SDK in modo rigido, quindi dovrebbe funzionare per iOS, macOS, ecc. Inoltre, non è necessario disporre di alcun elemento nella directory di origine del progetto.
Dopo aver creato questo target, fai in modo che la tua libreria / framework dipenda da esso con un elemento Dipendenze target:
Ciò garantirà che la mappa del modulo venga generata prima della creazione del framework.
nota macOS : se stai supportando macOS
anche, dovrai aggiungere macosx
l' Supported Platforms
impostazione di build sulla nuova destinazione aggregata appena creata, altrimenti non inserirà la mappa del modulo nella Debug
cartella dei dati derivati corretta con il resto del prodotti quadro.
Successivamente, aggiungi la directory principale della mappa del modulo ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
, all'impostazione di build "Importa percorsi" nella sezione Swift ( SWIFT_INCLUDE_PATHS
):
Ricorda di aggiungere una $(inherited)
riga se hai percorsi di ricerca definiti a livello di progetto o xcconfig.
Questo è tutto, ora dovresti essere in grado di farlo import CommonCrypto
Aggiornamento per Xcode 10
Xcode 10 ora viene fornito con una mappa del modulo CommonCrypto che rende superflua questa soluzione alternativa. Se desideri supportare sia Xcode 9 che 10, puoi fare un controllo nella fase Run Script per vedere se la mappa del modulo esiste o no, ad es.
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