티스토리 뷰

iOS

Universal Framework 만들기

hyeonii_12 2020. 12. 13. 18:05

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 -"${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 -"${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/" 
cp -"${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 -"${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"
 
cs

프레임워크를 빌드하듯이 새로 만든 타겟을 빌드하면

유니버설 프레임워크가 만들어진 것을 볼 수 있습니다.

이제 이 .framework 파일을 앱 개발자에게 전달하면
iphoneos, iphonesimulator 할 것 없이 프레임워크를 사용할 수 있습니다!

'iOS' 카테고리의 다른 글

Objective-C <-> Swift 코드 사용하기  (1) 2021.02.21
[iOS] Dark Mode 해제 (User Interface Style)  (5) 2020.10.19
댓글