본문 바로가기
Xcode/IOS

IOS) Umbrella Framework 생성 및 배포(feat : CoCoaPods)

by 후르륵짭짭 2023. 1. 29.
728x90
반응형

 

일본 어딘가 스누프 가게에서

** 관련 사이트 ** 

2022.11.27 - [Xcode/Swift - PlayGround] - PlayGround) Framework를 통해 모듈화 작업하기

2022.12.17 - [Xcode/Swift - PlayGround] - PlayGround) Framework UnitTest 생성 해보기

2023.01.29 - [Xcode/ERROR] - ERROR) Custom Framework에서 3rd Party Lib의 Protocol을 사용할 때 주의 점 (ex: Undefined symbol: _$s9Alamofire7AFError )

 

안녕하세요. 후르륵짭짭입니다.

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

 

[Swift 5.3] @_exported 속성 정리

주의 : 본 글은 비공식 속성을 다루므로 사용하는데 유의하시기 바랍니다. @_exported는 비공식 속성으로 _가 붙어있습니다. (비슷하게 현재 Async/Await 가 비공식으로 쓰기 위해선 import _Concurrency를

minsone.github.io

https://medium.com/@kitasuke/optimizing-launch-time-of-modularized-ios-app-67f6e1080cb3

 

Optimizing launch time of modularized iOS app

Hi, I’m @kitasuke, iOS Engineer. I would like to share how I optimized app launch time by about 30% using Static Framework.

medium.com

 

728x90
반응형

댓글