티스토리 뷰

CS/iOS

[iOS] Universal Framework 만들기

Napster 2018. 5. 15. 13:28

Universal Framework를 만들어보자.

> 2018.5.14
> swift 4.1
xcode Version 9.3 (9E145)

  지난편에 나만의 Framework만들기를 알아보았다. 이제는 Universal Framework를 만들어보자. Universal Framework를 알게된 계기는 다음과 같다.
저번에 만든 프레임워크를 내가 사용하고자하는 앱에 import해서 사용하는데 시뮬레이터로 빌드를 하면 도저희 나의 라이브러리라 인식을 못하는 문제가 발생하였다. 실제기기(iphoneOS)에서는 아무문제없이 사용이되었지만, 시뮬레이터에서는 그렇지 못했다. 

처음엔 내가 프레임워크를 잘못 만들줄알고, 계속 설정을 조금조금씩 바꿔가면서 다시 만들기를 반복하였다. 그러기를 3시간....

하지만 문제는! Universal Framework라는게 존재하고, iPhone OS, SimulatorOS둘다 적용하기위해선 Valid Architecture 가 모두 있어야 한다는 뜻이다. 즉, 실제 iPhoneOS의 Core(CPU)는 armv7 armv7s arm64로 이루어져있고 맥OS에서 구동되는 시뮬레이터의 경우 i386 x86_64으로 cpu가 구현되어있어 맞춰줘야 한다는 것이다.

그래서 간단하게 처리함으로써 두가지 모두를 만족하는 프레임 워크를 만들어보자.

초기설정

그림1. 내가 만들고있던 프레임워크 프로젝트에서 새로운 타겟을 추가해준다.


1. 그림1의 좌측 하단에 + 를 눌러 타겟을 추가한다.

2. Cross-platform에 Aggregate를 선택하여 추가한다.


그림2. 쉘스크립트 실행 스크립트 추가


3. UniversalLumberJack이라는 타겟이 빌드될때 실행되는 스크립트이다. 다음을 추가하여 넣어준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PROJECT_NAME="LumberJack"
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
 
# Make sure the output directory exists
mkdir -"${UNIVERSAL_OUTPUTFOLDER}"
 
# Next, work out if we're in SIM or DEVICE
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" 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 "${BUILD_DIR}/${CONFIGURATION}-universal/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
 
open "${UNIVERSAL_OUTPUTFOLDER}"
 
cs

위의 셀스크립의 내용은 정말 간단하다. (하지만 다른 검색해서 나오는 방법들은 동작하지 않아서 도대체 왜안되는지 알 수 없었다..)
Config에따른 폴더를 만들고, 그디렉토리에 iphonesos로 빌드된 프레임워크 dir을 복사한다.(cp)

그리고 simulator로 빌드된곳에 Modules에 i386 x86_64모듈을 복사해 한곳으로 모아준다. 

마지막으로 lipo명령어를 이용하여 하나의 Module로 생성하여준다.

이게다다.



결론

  이전편인 나만의 Framework만들기 이 후 동일하게 사용하고자하는 프로젝트에서 바이러니파일을 추가하여 사용하면된다. 이것을 완료한 후 또다른 미션을 받았으니.. 그것은 CocoaPod private으로 만들기이다.


Comments