안녕하세요. 후르륵짭짭입니다.
최근에 사내 업무를 진행 중 신규 장기 프로젝트를 진행 중인데,
메인 프로젝트에서는 Build 속도, Indexing 모두 너무 느려져서 빠르게 개발하기 어렵다고 판단!
Framework를 통해 모듈화 작업을 진행하기로 했습니다.
정말 많은 시간을 Research하는데 시간을 사용했고, 아직 100% 만족하지 못하여 StackOverflow에 질문을 올려 기다리는 중 입니다.
Framework를 통해 모듈화 작업을 해보는게 이번이 처음이였기 때문에 부족한 점도 많고
더 경험해야 할게 많아졌습니다.
** Static 프레임워크 VS Dynamic 프레임워크 **
일단 프레임 워크에는 두가지 종류가 있습니다.
Excute 파일에 소스 코드가 들어 있어 프로젝트의 용량은 증가하지만 Build 타임을 개선 시킬 수 있는 Static
프로젝트 내에 Framework를 Linking 시켜놓아서 용량은 작아지지만 Building 타임에 빌드되어 Build가 느려지는 Dynamic 이 있습니다.
이 외에도 embed와 Do not embed가 있습니다.
Embed는 말 그대로 프로젝트에 해당 Framework를 Linking 시키는 작업입니다.
Do not embed는 프로젝트에 Framework를 Linking 시키지 않는 것이죠.
그러니 Dynamic Framework는 Linking을 통해 Framework를 찾아가니 Embed를 해줘야하고
Static은 이미 Excute 파일에 들어가 있으니 Linking 작업을 해줄 필요가 없으니 Do not Embed 해도 잘 작동 합니다.
자세한 설명은 아래 유튜브 영상을 보는 것을 추천합니다.
https://www.youtube.com/watch?v=IqsKGyklmL0&list=LL&index=4&t=2280s&ab_channel=EssentialDeveloper
** 3rd Party Framework 의존성 가지기 **
만약에 생성한 Framework가 3rd Party Framework(RxSwift, Realm 등)에 의존성을 가지고 있다면
적용하려는 최종 App에도 해당 Framework가 Dynamic Framework 형태로 가지고 있어야합니다.
만약에 최종 App에 Static Framework로 되어 있다면 Linking이 되어 있지 않기 때문에 에러가 발생 합니다.
예를들어 (library not loaded @rpath...., Image not found 등),,,, ㅠㅠ
** Universal Framework로 생성하기 **
Framework를 생성하는 방법 중 XCFramework와 Universal Framework 두가지 방법이 있습니다.
이전에 XCFramework와 Universal Framework 차이에 대해 설명한 적이 있습니다.
https://syshen.medium.com/create-an-ios-universal-framework-148eb130a46c
위 블로그는 Universal Framework를 생성하는 방법에 대해 잘 정리한 글 입니다.
일단 Universal Framework는 하나의 Framework에 여러가지 시스템 아키텍처(arm64 , x86 등)을 넣어주는 것 입니다.
현재 M1 , M2 시스템 아키텍처도 나왔지만 Intel mac도 있기 때문에 Xcode에서 시뮬레이터를 빌드하면
시뮬레이터는 노트북의 시스템 아키텍처를 따라서 시뮬레이터를 실행 시킵니다.
따라서 arm64 , intel 시리즈를 사용하고 있는 개발 부서일 경우, Framework에 두가지 형태를 모두 가지고 있는 Framework가 있어야
아이폰과 시뮬레이터 모두에서 빌드가 가능해 집니다.
위 유튭 영상을 통해 수동으로 어떻게 Universal Framework를 만들 수 있을지 보면 좋을 것 같습니다.
** XCFramework 생성 방법 및 Build Script 꿀 팁 **
https://hururuek-chapchap.tistory.com/216
위에 XCFramework를 생성하는 방법에 대해 정리 하였습니다.
그런데 매번 이렇게 터미널로 작업하는거 쉽지 않습니다.
따라서 Xcode 내부에 아래 이미지 처럼 Aggregate를 만들어 주고
Build Phases에 New Run Script Phase에 Shell Script를 추가 해주면 됩니다.
그럼 다음에 Target을 변경 후 Run을 해주면 지정한 Path에 Framework가 생성 됩니다.
rm -rf "${BUILD_DIR}/build"
xcodebuild archive -workspace ${PROJECT_NAME}.xcworkspace -scheme ${PROJECT_NAME} -configuration "${CONFIGURATION}" -destination 'generic/platform=iOS' -archivePath "${BUILD_DIR}/build/${PROJECT_NAME}.${CONFIGURATION}-device.xcarchive" SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
xcodebuild archive -workspace ${PROJECT_NAME}.xcworkspace -scheme ${PROJECT_NAME} -configuration "${CONFIGURATION}" -destination 'generic/platform=iOS Simulator' -archivePath "${BUILD_DIR}/build/${PROJECT_NAME}.${CONFIGURATION}-simulator.xcarchive" SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
xcodebuild -create-xcframework -framework ${BUILD_DIR}/build/${PROJECT_NAME}.${CONFIGURATION}-device.xcarchive/Products/Library/Frameworks/${PROJECT_NAME}.framework -framework ${BUILD_DIR}/build/${PROJECT_NAME}.${CONFIGURATION}-simulator.xcarchive/Products/Library/Frameworks/${PROJECT_NAME}.framework -output ${BUILD_DIR}/build/${PROJECT_NAME}.xcframework
open "${BUILD_DIR}/build"
위와 같이 Buil Script를 작성 해주면 XCFramework가 생성 됩니다.
** StackOverFlow에 올린 질문 **
제발 답변 부탁드릴게요 ㅠㅠ
3rd Party의존성을 가진 Framework에서 Unit Test를 만드는데 발생하는 이슈 :
XCFramework 내부 소스가 보이게 만드는 방법 :
https://stackoverflow.com/questions/74590076/how-to-make-visible-internal-source-code-of-xcframework
** 참고 사이트 **
XCFramework Build Library Distribution 을 YES로 설정 안 할 경우 :
https://developer.apple.com/forums/thread/125646
Universal Framework를 생성하는데 발생하는 오류 :
https://stackoverflow.com/a/52400113
Cocoapod에 발생한 이슈 :
기타 :
https://soojin.ro/blog/application-library-test
'Xcode > Swift - PlayGround' 카테고리의 다른 글
PlayGround) Framework UnitTest 생성 해보기 (0) | 2022.12.17 |
---|---|
PlayGround) Framework 생성 모듈화 작업 #2 (0) | 2022.12.04 |
PlayGround) Swift Combine 적응기 #1 (Custom Publisher) (0) | 2022.11.05 |
PlayGround) Objective-C (상속, 카테고리, 프로토콜, 구조체) 정리 (1) | 2022.09.26 |
PlayGround) Async - Await 경험 정리#1 (0) | 2022.08.13 |
댓글