** 관련 사이트 **
2022.11.27 - [Xcode/Swift - PlayGround] - PlayGround) Framework를 통해 모듈화 작업하기
2022.12.17 - [Xcode/Swift - PlayGround] - PlayGround) Framework UnitTest 생성 해보기
안녕하세요. 후르륵짭짭입니다.
Moya의 Target Type이 Property가 Enum으로 되어 있어서 원인 모를 이유 때문에 Build Error가 발생했습니다.
그래서 해당 이슈 해결의 연장선으로 Umbrella Framework를 적용해봤는데, 힘들게 아주 힘들게
성공적으로 빌드가 되더군요 ^^.
그럼 3rd Party 라이브러리를 한 곳에 모아두는 UmBrella Framework를 생성하는 방법에 대해 설명하도록 하겠습니다.
** Custom Framework를 Dynamic으로 설정 **
위 이미지와 같이 Framework의 Mach-O Type을 Dynamic Library로 설정해줍니다.
그리고 만약 Intel MacBook을 사용하고 있다면
시뮬레이터에서 arm64 형태로 빌드가 되지 않게 하기 위해 ARM64 아키텍트를 지워줍니다.
이제 other link Flags에서 -all_load를 추가 해줍니다.
그리고 다른쪽으로 배포를 할 것이니 Build Libraries for Distribution을 Yes로 설정하였습니다.
** CoCoPod Libarary를 Static 으로 변경 **
위와 같이 원하는 Cocoapods Libarary를 작성 후 Static으로 받을 수 있게
install! 'cocoapods', :generate_multiple_pod_projects => true, incremental_installation: true
use_frameworks! :linkage => :static
으로 설정 해줍니다.
그리고 나서 pod install을 해주면 아래와 같이 Pod이 프로젝트 형태로 나오게 될 겁니다.
그리고 나서 각각 Simulator와 Iphone 용으로 빌드 해줍니다.
** 외부 프로젝트에서 Cocoapod 라이브러를 사용할 수 있게 Export 하기 **
위와 깉이 @_exported anotation을 통해서 외부 프로젝트에서 사용할 수 있도록 해줍니다.
** Universal Framework 생성 하기 **
이제 부터는 두개의 execute file을 합쳐 줄 겁니다.
lipo -create ../시뮬레이터 Path/<프레임워크 이름>.framework/<프레임워크 이름> ../아이폰 Path/<프레임워크 이름>.framework/<프레임워크 이름>
-output ./<프레임워크 이름>
위와 같이 Lipo 방식을 사용해서 Universal excute를 생성해줍니다.
lipo -info /<프레임워크 이름>.framework/<프레임워크 이름>
Architectures in the fat file: /<프레임워크 이름>.framework/<프레임워크 이름> are: x86_64 arm64
그리고 위와 같이 x86_64와 arm64가 존재하는지 확인합니다.
시뮬레이터 폴더에 방금 만든 Framework exec 파일을 복사 해서 넣어 줍니다.
** Header 파일 수정하기 **
위 Path에서 -Swift.h 파일을 열어 코드를 수정 해줍니다.
가장 상단의 #if 와 #elif 부분을 제거 해줍니다.
그리고 마지막 부분도 제거 해줍니다.
** Iphone용의 Modules 복사해서 넣고 불필요한 파일 제거하기 **
불필요한 파일은 abi.json 과 private.swiftinterface 부분을 제거 해줍니다.
** 다른 프로젝트에 넣고 Build 하기 **
이제 적용하려는 프로젝트에 방금 생성한 Framework를 복사해서 넣고
Device와 Simulator에 모두 잘 빌드 되는지 확인 합니다!
그리고 위와 같이 pod file에 Moya가 없더라도 정상적으로 Moya를 사용할 수 있게 되는지 확인 합니다.
위와 같은 방식을 Umbrella Framework라고 합니다.
다만 주의할 점이 있습니다!
Umbrella Framework는 애플에서 권장하는 방식이 아닙니다.
따라서 XCFramework로는 빌드가 되지 않습니다!! (<- 이거 땜에 무진장 고생)
그래서 Fat Framework로 개발해야합니다 ㅠㅠ
다만 App Launch Time 속도를 증가 시킬 수 있으며
하나의 Framework에서 Universal를 모아둘 수 있습니다.
앱 프로젝트는 Pod이 없는 상태로 깔끔하게 작업을 진행 할 수 있을 겁니다.
하지만 Main 프로젝트에도 Pod으로 동일한 3rd Party 라이브러리를 가지고 있다면
Framework 중복 사용으로 에러가 발생합니다. (<- 주의 해야함)
** 참고 사이트 **
https://minsone.github.io/programming/swift-annotation-_exported
https://medium.com/@kitasuke/optimizing-launch-time-of-modularized-ios-app-67f6e1080cb3
'Xcode > IOS' 카테고리의 다른 글
iOS) SwiftUI 내 맘 정리#1 (feat: Animation , Circle & Capsule , DragGesture) (0) | 2023.03.05 |
---|---|
IOS) Framework 서브모듈 배포 (feat: Submodule + Cocoapod) (0) | 2023.02.10 |
IOS) TestFlight로 앱 배포하기와 오류들 (feat : X86 제거) (0) | 2023.01.12 |
SwiftUI) SwiftUI 체험기#1 - 다양한 Binding (0) | 2022.08.20 |
IOS)XCFramework로 통합 Framework Package를 만들어보자 (2) | 2022.07.17 |
댓글