** 그외 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
XCFramework란
https://blog.embrace.io/xcode-12-and-xcframework/
https://medium.com/dev-jam/xcframeworks-new-format-of-packaging-frameworks-in-ios-306cda40b24f
Framework 기본적인 방법
https://jhnjslee.tistory.com/4
https://es1015.tistory.com/433
https://es1015.tistory.com/434
Fat Framework 생성
https://iamprgrmr.tistory.com/28
기타
https://chibest.tistory.com/72
https://stackoverflow.com/questions/65645983/how-to-change-deployment-target-in-xcode-12-3
https://gist.github.com/sekati/3172554
'Xcode > IOS' 카테고리의 다른 글
IOS) TestFlight로 앱 배포하기와 오류들 (feat : X86 제거) (0) | 2023.01.12 |
---|---|
SwiftUI) SwiftUI 체험기#1 - 다양한 Binding (0) | 2022.08.20 |
IOS)Moya 간단 사용 정리하기 (0) | 2022.06.26 |
SwiftUI) LazyGride 대한 경험 정리 (0) | 2022.06.11 |
IOS) RxTableViewSectionedReloadDataSource를 실습해보기 (0) | 2021.10.24 |
댓글