Coś nieco prostszego i bardziej niezawodnego polega na utworzeniu celu agregującego o nazwie „CommonCryptoModuleMap” z fazą Run Script w celu automatycznego wygenerowania mapy modułów i prawidłowej ścieżki Xcode / SDK:
Faza Uruchom skrypt powinna zawierać ten 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
Używanie kodu powłoki i ${SDKROOT}
oznacza, że nie musisz kodować na stałe ścieżki Xcode.app, która może różnić się w zależności od systemu, szczególnie jeśli używasz xcode-select
do przejścia do wersji beta lub budujesz na serwerze CI, na którym zainstalowanych jest wiele wersji w niestandardowych lokalizacjach. Nie musisz też kodować na stałe SDK, więc powinno to działać na iOS, macOS itp. Nie musisz też mieć niczego, co mogłoby znajdować się w katalogu źródłowym twojego projektu.
Po utworzeniu tego celu uzależnij swoją bibliotekę / strukturę za pomocą elementu Zależności docelowe:
Zapewni to wygenerowanie mapy modułów przed zbudowaniem frameworka.
Uwaga dotycząca systemu macOS : jeśli również wspierasz macOS
, musisz dodać macosx
do Supported Platforms
ustawienia kompilacji nowego właśnie utworzonego celu zagregowanego, inaczej nie umieści on mapy modułów w odpowiednim Debug
folderze danych pochodnych wraz z resztą produkty ramowe.
Następnie dodaj katalog nadrzędny mapy modułów ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
do ustawienia kompilacji „Importuj ścieżki” w sekcji Swift ( SWIFT_INCLUDE_PATHS
):
Pamiętaj, aby dodać $(inherited)
wiersz, jeśli masz ścieżki wyszukiwania zdefiniowane na poziomie projektu lub xcconfig.
To wszystko, powinieneś teraz być w stanie import CommonCrypto
Zaktualizuj Xcode 10
Xcode 10 jest teraz dostarczany z mapą modułów CommonCrypto, dzięki czemu to obejście nie jest konieczne. Jeśli chcesz obsługiwać zarówno Xcode 9, jak i 10, możesz sprawdzić w fazie Run Script, czy mapa modułu istnieje, czy nie, np.
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