본문 바로가기
Xcode/IOS

IOS)XCFramework로 통합 Framework Package를 만들어보자

by 후르륵짭짭 2022. 7. 17.
728x90
반응형

최근 카페 어딘가에서

 ** 그외 XCFramework 관련 글 ** 

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

2022.12.04 - [Xcode/Swift - PlayGround] - PlayGround) Framework 생성 모듈화 작업 #2

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

2023.01.12 - [Xcode/IOS] - IOS) TestFlight로 앱 배포하기와 오류들 (feat : X86 제거)

 

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

이번에는 Famework를 만드는 방법에 정리하려고 합니다.

사내에서 특정 Opensource를 받아서 저희 것으로 Custom하게 개발해야할 일이 생겼는데,

개발 된 것을 Famework로 변형하여 저희 사내 앱에 이식하려고 합니다.

그래서 처음으로 Framework를 만드는 방법을 경험하고 정리하려고 합니다.

 

** Framwork의 원칙 **

Framework를 만들 때 3가지 원칙이 있습니다.

1. Encapsulate (캡슐화) - 외부 / 내부의 접근성의 정의

2. Modularize (모듈화) - 기능에 대한 구분

3. Reuse (재사용성) - 재사용성

이렇게 3가지 원칙을 지키면서 개발을 해야합니다.

 

** XCFramework vs Fat Framework ** 

기존에 Framework에서 시뮬레이터와 실제 디바이스에서 모두 해당 Framework가 작동하게 하려면 

Arm64 , arm7 , x86_64 등을 모두 빌드하여 하나의 Framework에 통합을 해야했습니다.

이렇게 하면 하나의 Framework에 모든 빌드 아키텍처가 들어가 있는 형태가 됩니다.

즉, 시뮬레이터에서는 x86_64 아키텍처만 필요한데 Arm64까지 들어가 있는 걸 사용하게 되는 형태가 됩니다.

이런 방식을 Fat Framework라고 합니다.

하지만 이런 방식은 용량이 커질 뿐만 아니라 불필요한 작업이 들어가게 됩니다.

( 앱 배포할 경우 x86_64는 빼주고 배포하는 등 불필요한 작업이 필요합니다. )

이러한 문제를 해결하기 위해 XCFramework가 등장했습니다.

위와 같이 하나의 프레임워크에 각각의 아키텍처를 분리합니다. 

이럴 경우 빌드 타임에 필요한 아키텍처로 빌드를 하면 됩니다 .

이런식으로 말이죠.

 

** XCFramework 생성하기 **

Xcode에 들어가서 Framework를 생성하고 

Build Libraries for Distribution을 Yes로 해줍니다 .

(해당것을 YES로 안하면 XCFramework로 생성 할 수 없습니다.)

 

- Platform에 맞게 Framework를 생성한다 - 

이제 프레임워크를 생성해야합니다.

//Iphone을 위한 Framework
xcodebuild archive \
-scheme TestFramework \
-configuration Release \
-destination 'generic/platform=iOS' \
-archivePath './build/TestFramework.framework-iphoneos.xcarchive' \
SKIP_INSTALL=NO \
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

//시뮬레이터를 위한 Framework
xcodebuild archive \
-scheme TestFramework \
-configuration Release \
-destination 'generic/platform=iOS Simulator' \
-archivePath './build/TestFramework.framework-iphonesimulator.xcarchive' \
SKIP_INSTALL=NO \
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

터미널로 해당 프로젝트로 이동 후 다음 명령어를 작성해주면 Framework가 생성이 됩니다.

 

- Framework를 통합하는 XCFramework 생성 - 

xcodebuild -create-xcframework \
-framework './build/TestFramework.framework-iphoneos.xcarchive/Products/Library/Frameworks/TestFramework.framework' \
-framework './build/TestFramework.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/TestFramework.framework' \
-output './build/TestFramework.xcframework'

이렇게 -create-xcframework 명령어를 통해서 XCFramework를 생성해줍니다.

이렇게 프레임워크가 생성이 될 겁니다.

그리고 Import 할 프로젝트에 가서 아래 위치에 추가 해줍니다.

 

** 주의 사항 **

 - Framework의 Deployment Target 설정을 App의 Deployment Target 보다 낮게하기 -

특별한 이유가 없다면 Deplyment Target을 낮추는게 좋습니다. 

Showing Recent Messages
Dylib (....) was built for newer iOS version (15.0) than being linked (14.5)

이러한 경고가 나오기 때문입니다.

 

 - Framework Version 관리 -

Framework는 계속해서 발전하기 때문에 해당 버전이 어떤 버전인지 명확하게 구분해줘야합니다.

그렇지 않으면 모호해지고 사용자가 어떤 상품을 사용하지는 알기 어렵기 때문이다.

그래서 xcframework의 info.plist의 값 관리를 잘 해줘야 한다.

//XCFrameworkFormatVersion의 Key 값을 가져오기
/usr/libexec/PlistBuddy -c "Print XCFrameworkFormatVersion" "{Path}/TestFramework.xcframework/Info.plist"

//XCFrameworkFormatVersion의 Value 값을 변경하기
/usr/libexec/PlistBuddy -c "Set :XCFrameworkFormatVersion 2.0" "{Path}/TestFramework/build/TestFramework.xcframework/Info.plist"

/usr/libexec/PlistBuddy 명령어를 통해서 읽어 오는 것과 값을 설정하는 것 두가지 가능하다.

(위에 것들을 모두 반복하기 귀찮으니, 한번에 할 수 있는 Script 파일을 만들면 더 좋겠죠??? 나중에 정리하도록 하겠습니다.)

 

** 참고 사이트  **

본문 

https://www.raywenderlich.com/17753301-creating-a-framework-for-ios

 

Creating a Framework for iOS

Learn how to build an iOS framework, which lets you share code between apps, modularize your code or distribute it as a third-party library.

www.raywenderlich.com

 

XCFramework란 

https://medium.com/trueengineering/xcode-and-xcframeworks-new-format-of-packing-frameworks-ca15db2381d3

 

Xcode and XCFrameworks — new format of packing frameworks

In life of many companies, which have and develop their own stack of libraries (libs) and components, there comes a time when volumes of…

medium.com

https://blog.embrace.io/xcode-12-and-xcframework/

 

Breaking Changes with Xcode 12 and XCFramework

With Xcode 12, you must now use XCFrameworks instead of fat frameworks. Learn how to troubleshoot issues when using binary frameworks.

blog.embrace.io

http://minsone.github.io/ios/mac/ios-wwdc-2019-binary-frameworks-in-swift-little-summary-and-translate

 

[번역][WWDC][Xcode] Binary Frameworks in Swift 살짝 정리 - XCFramework

들어가기 전 WWDC 2019 - Binary Frameworks in Swift 세션의 발표를 번역 및 일부 요약하였습니다. XCFramework를 만드는 방법 및 프레임워크를 다룰 때 어떻게 해야하는지, 호환성은 어떻게 지켜야 하는지 등

minsone.github.io

https://medium.com/strava-engineering/convert-a-universal-fat-framework-to-an-xcframework-39e33b7bd861

 

Convert a Universal (FAT) Framework to an XCFramework

Strava had a pre-compiled third party dependency that didn’t fit under our repository size limit. See how we solved this with a XCFramework.

medium.com

https://medium.com/dev-jam/xcframeworks-new-format-of-packaging-frameworks-in-ios-306cda40b24f

 

XCFrameworks — New Format of Packaging Frameworks in iOS

At WWDC 2019, Apple introduced a new format for packaging frameworks called XCFrameworks, which allows developers to conveniently …

medium.com

 

 

Framework 기본적인 방법 

https://jhnjslee.tistory.com/4

 

[Swift] Framework (Library) 만들고 프로젝트에 추가하기

프로토콜 파일이나 특정 모듈을 만들때 필요한것이 바로 라이브러리화 시켜서 집어 넣는것입니다. 안드로이드에서는 .aar 파일로 만들어서 추가하였는데 Swift에서는 다릅니다. 일단 만들고자 하

jhnjslee.tistory.com

https://es1015.tistory.com/433

 

[iOS] framework 생성 및 사용 방법 (1 - 생성 방법)

iOS framework(프레임워크) 생성 및 사용 방법 ※ 해당 글에서는 objective-c로 설명하지만 swift도 거의 동일합니다. ※ 내용이 길어 두 개의 포스팅으로 나눴습니다. 해당 글에서는 framework 생성 방법과

es1015.tistory.com

https://es1015.tistory.com/434

 

[iOS] framework 생성 및 사용 방법 (2 - 사용 방법)

iOS framework(프레임워크) 생성 및 사용 방법 ※ 해당 글에서는 objective-c로 설명하지만 swift도 거의 동일합니다. ※ 내용이 길어 두 개의 포스팅으로 나눴습니다. 해당 글에서는 framework 사용 방법을

es1015.tistory.com

 

Fat Framework 생성 

https://iamprgrmr.tistory.com/28

 

Fat Framework 만들기

Fat Framework 만들기 이번에는 저번 포스팅에 이어서 Fat Framework를 만드는 법을 소개하겠습니다. 프레임워크가 시뮬레이터, 실물 기기에서 모두 동작하기 위해서 x86_64, i386, ARM64, ARMv7 등의 아키텍쳐

iamprgrmr.tistory.com

 

기타 

https://chibest.tistory.com/72

 

[Xcode 12] 인텔 맥북과 M1 맥북의 Architecture 차이점(x86_64와 Arm64)

사건의 발단 6월부터 새로운 iOS 앱을 맡게 되었다. 시니어가 유지 보수하던 우리 회사 가장 잘 나가는(?) 앱인데 사이즈가 꽤나 큰 편이다. 그런데 문제가 생겼다. 첫 빌드부터 잘 안 되는 것이었

chibest.tistory.com

https://stackoverflow.com/questions/65645983/how-to-change-deployment-target-in-xcode-12-3

 

How to change deployment target in Xcode 12.3?

I'm seeing the following warning messages in xcode whenever compiling my app. The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment ...

stackoverflow.com

https://stackoverflow.com/questions/40859139/initializer-is-inaccessable-due-to-internal-protection-level

 

Initializer is inaccessable due to 'internal' protection level

I have some protocols LoginStrategy public protocol LoginStrategy { func login(_ viewController: UIViewController) func getUserInfo(withCompletionHandler completionHandler: @escaping (_

stackoverflow.com

https://gist.github.com/sekati/3172554

 

Xcode Auto-increment Build & Version Numbers

Xcode Auto-increment Build & Version Numbers. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

https://stackoverflow.com/questions/20382159/how-can-i-read-a-custom-keys-value-in-info-plist-and-use-it-in-xcodes-build-se

 

How can I read a custom key's value in Info.plist and use it in Xcode's build settings?

I am attempting to read a custom info.plist key's value into a User Defined Build Setting. The 'APP_VERSION' is a macro defined in my INFOPLIST_PREPROCESSOR_DEFINITIONS file. What I am trying to

stackoverflow.com

 

728x90
반응형

댓글