Quelque chose d'un peu plus simple et plus robuste consiste à créer une cible d'agrégation appelée "CommonCryptoModuleMap" avec une phase d'exécution de script pour générer automatiquement la carte du module et avec le chemin Xcode / SDK correct:
La phase d'exécution du script doit contenir cette 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'utilisation du code shell et ${SDKROOT}
signifie que vous n'avez pas à coder en dur le chemin Xcode.app qui peut varier d'un système à l'autre, en particulier si vous utilisez xcode-select
pour passer à une version bêta, ou si vous construisez sur un serveur CI où plusieurs versions sont installées dans des endroits non standard. Vous n'avez pas non plus besoin de coder en dur le SDK, cela devrait donc fonctionner pour iOS, macOS, etc. Vous n'avez pas non plus besoin d'avoir quoi que ce soit dans le répertoire source de votre projet.
Après avoir créé cette cible, faites en sorte que votre bibliothèque / structure en dépende avec un élément Target Dependencies:
Cela garantira que la carte du module est générée avant la création de votre framework.
Remarque macOS : si vous prenez également en charge macOS
, vous devrez ajouter macosx
au Supported Platforms
paramètre de construction sur la nouvelle cible d'agrégation que vous venez de créer, sinon il ne placera pas la carte de module dans le bon Debug
dossier de données dérivées avec le reste du produits de cadre.
Ensuite, ajoutez le répertoire parent de la mappe de module,, au ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
paramètre de construction "Import Paths" sous la section Swift ( SWIFT_INCLUDE_PATHS
):
N'oubliez pas d'ajouter une $(inherited)
ligne si vous avez des chemins de recherche définis au niveau du projet ou de xcconfig.
Ça y est, vous devriez maintenant pouvoir import CommonCrypto
Mise à jour pour Xcode 10
Xcode 10 est maintenant livré avec une carte de module CommonCrypto rendant cette solution de contournement inutile. Si vous souhaitez prendre en charge à la fois Xcode 9 et 10, vous pouvez effectuer une vérification dans la phase Exécuter le script pour voir si la carte du module existe ou non, par exemple
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