조금 더 간단하고 강력한 것은 Run Script 단계로 "CommonCryptoModuleMap"이라는 집계 대상을 생성하여 올바른 Xcode / SDK 경로로 모듈 맵을 자동으로 생성하는 것입니다.
스크립트 실행 단계에는 다음 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
쉘 코드를 사용 ${SDKROOT}
하면 Xcode.app 경로를 하드 코딩 할 필요가 없으며 특히 시스템을 사용하는 경우 시스템마다 다를 수 있습니다xcode-select
베타 버전으로 전환하거나 여러 버전이 설치된 CI 서버에 구축하는 경우 비표준 위치. 또한 SDK를 하드 코딩 할 필요가 없으므로 iOS, macOS 등에서 작동합니다. 또한 프로젝트의 소스 디렉토리에 아무것도 없어도됩니다.
이 대상을 만든 후 대상 종속성 항목을 사용하여 라이브러리 / 프레임 워크에 종속되도록하십시오.
이를 통해 프레임 워크가 빌드되기 전에 모듈 맵이 생성됩니다.
macOS 참고 : 지원하는 경우 방금 만든 새 집계 대상 의 빌드 설정에 macOS
추가해야합니다 . 그렇지 않으면 나머지 맵이있는 올바른 파생 데이터 폴더 에 모듈 맵이 배치되지 않습니다 . 프레임 워크 제품.macosx
Supported Platforms
Debug
다음으로 ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
Swift 섹션 ( SWIFT_INCLUDE_PATHS
) 아래의 "Import Paths"빌드 설정에 모듈 맵의 상위 디렉토리를 추가하십시오 .
$(inherited)
프로젝트 또는 xcconfig 수준에서 검색 경로를 정의한 경우 줄 을 추가해야 합니다.
그게 다야 이제는 import CommonCrypto
Xcode 10 업데이트
Xcode 10은 이제 CommonCrypto 모듈 맵과 함께 제공되어이 해결 방법이 불필요합니다. Xcode 9와 10을 모두 지원하려면 스크립트 실행 단계에서 모듈 맵의 존재 여부를 확인하십시오.
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