Universal Framework 만들기
Universal Framework 만들기
Swift Version 5.3
Xcode Version 12.2
이전 글을 통해 Framework를 만들었습니다.
프레임워크를 만든 이유는 다른 앱에서도 해당 프레임워크 안에 있는 함수 등을 사용할 수 있도록 하는 것인데요,
제가 만든 프레임워크를 빌드 후 앱을 만드는 개발자에게 .framework
파일을 전달하면 됩니다.
이런 식으로 'FrameworkTest'라는 이름의 프레임워크를 빌드하고
좌측 패널의 Products 폴더를 보면 FrameworkTest.framework
파일이 생긴 것을 볼 수 있습니다.
파일을 선택한 후 우측 패널을 보면 Full Path에서 해당 프레임워크 파일의 위치를 볼 수 있고 화살표 버튼을 눌러 파인더에서 해당 파일의 위치를 열 수도 있습니다.
그러나 폴더를 자세히 보면Debug-iphonesimulator
라는 이름으로 폴더가 만들어져있습니다.
그렇다면 프레임워크 파일을 전달할 때 iphoneos 용 파일과 iphonesimulator 용 파일을 따로 만들어서 전달해야 할까요?
이를 해결하기 위해서 나온 것이 Universal Framework입니다.
만드는 방법은 아래와 같습니다.
좌측 패널에서 프레임워크 프로젝트를 선택 후
타겟 아래의 + 버튼을 눌러서
Other > Aggregate를 추가합니다.
Targets에 새로운 타겟이 추가된 것이 보이시나요?
Build Phases 메뉴에서 + 버튼을 눌러서 New Run Script Phases 를 추가합니다.
그리고 아래 코드를 입력합니다.
1
2
3
4
5
6
7
8
9
10
|
#!/bin/sh
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" EXCLUDED_ARCHS="arm64" clean build
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"
|
cs |
프레임워크를 빌드하듯이 새로 만든 타겟을 빌드하면
유니버설 프레임워크가 만들어진 것을 볼 수 있습니다.
이제 이 .framework 파일을 앱 개발자에게 전달하면
iphoneos, iphonesimulator 할 것 없이 프레임워크를 사용할 수 있습니다!