Etwas einfacher und robuster ist es, ein Aggregatziel namens "CommonCryptoModuleMap" mit einer Run Script-Phase zu erstellen, um die Modulzuordnung automatisch und mit dem richtigen Xcode / SDK-Pfad zu generieren:
Die Run Script-Phase sollte diesen Bash enthalten:
# 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
Wenn Sie Shell-Code verwenden ${SDKROOT}
, müssen Sie den Pfad Xcode.app nicht hart codieren, was von System zu System variieren kann, insbesondere wenn Sie xcode-select
zu einer Beta-Version wechseln oder auf einem CI-Server aufbauen, auf dem mehrere Versionen installiert sind an nicht standardmäßigen Standorten. Sie müssen das SDK auch nicht hart codieren, damit dies für iOS, macOS usw. funktioniert. Außerdem muss sich nichts im Quellverzeichnis Ihres Projekts befinden.
Stellen Sie nach dem Erstellen dieses Ziels Ihre Bibliothek / Ihr Framework mit einem Element "Zielabhängigkeiten" davon abhängig:
Dadurch wird sichergestellt, dass die Modulzuordnung generiert wird, bevor Ihr Framework erstellt wird.
macOS-Hinweis : Wenn Sie ebenfalls unterstützen macOS
, müssen Sie macosx
die Supported Platforms
Build-Einstellung für das neue Aggregatziel, das Sie gerade erstellt haben, erweitern, da sonst die Modulzuordnung nicht Debug
mit dem Rest des Ordners im richtigen abgeleiteten Datenordner abgelegt wird Rahmenprodukte.
Fügen Sie als Nächstes das übergeordnete Verzeichnis ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
der Modulzuordnung zur Build-Einstellung "Pfade importieren" im Abschnitt "Swift" ( SWIFT_INCLUDE_PATHS
) hinzu:
Denken Sie daran, eine $(inherited)
Zeile hinzuzufügen , wenn Sie Suchpfade auf Projekt- oder xcconfig-Ebene definiert haben.
Das war's, du solltest es jetzt können import CommonCrypto
Update für Xcode 10
Xcode 10 wird jetzt mit einer CommonCrypto-Modulzuordnung geliefert, sodass diese Problemumgehung nicht mehr erforderlich ist. Wenn Sie sowohl Xcode 9 als auch Xcode 10 unterstützen möchten, können Sie in der Phase "Skript ausführen" überprüfen, ob die Modulzuordnung vorhanden ist oder nicht, z
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