일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- swift documentation
- combine
- SWIFT
- swiftUI
- tableView
- Human interface guide
- 애니메이션
- 스위프트
- ios
- Clean Code
- uitableview
- map
- UICollectionView
- 클린 코드
- Xcode
- RxCocoa
- ribs
- Refactoring
- uiscrollview
- rxswift
- 리팩토링
- Protocol
- 리펙터링
- UITextView
- clean architecture
- collectionview
- HIG
- MVVM
- 리펙토링
- Observable
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 3. 모듈화 개념 - XCFramework 생성, 사용 방법 본문
Tuist로 모듈화 최신 포스팅 글 목록 > https://ios-development.tistory.com/1303
1. 모듈화 개념 - Library vs Framework (static library, dynamic library, static framework, dynamic framework)
2. 모듈화 개념 - Binary File 개념 (Mach-O, CPU Architectures, Universal binary, lipo command)
3. 모듈화 개념 - XCFramework 생성, 사용 방법
XCFramework 개념
- 시뮬레이터 빌드를 포함하여 여러 플랫폼 (iOS, macOS, tvOS, watchOS)에서 사용할 수 있도록 Xcode에서 만든 배포 가능한 바이너리 패키지
- XCFramework는 Static Framework이거나 Dynamic Framework 둘 다 가능
- 원래 Static Framework는 Bundle화만 할 수 있었지만, XCFramework에서는 header와 함께 Bundling이 가능
- 애플 문서에 따르면, 앱에 동일한 XCFramework를 사용하는 여러개가 있는 경우일때는 반드시 하나만을 링크하도록 설정해야함
- XCode에서 XCFramework를 사용하는 곳은 아래처럼 Target -> General -> Frameworks 탭에 존재
XCFramework 생성 아이디어
- 프레임워크로 만들 프로젝트에서 여러 디바이스 타겟으로 설정 (XCFramework는 다양한 디바이스 제공하기 위해 나온개념이므로)
- Archiving을 하여 바이너리 파일(.xarchive)로 생성 (타겟이 여러개이므로 바이너리 파일도 여러개가 생성)
- 위에서 나온 바이너리 파일들을 XCFramework로 묶음 (완료)
XCFramework 생성 방법
- Framework 프로젝트 생성
- MyFunction이라는 파일을 만들고 예제로 사용할 함수를 3가지 정의 (a1, a2, a3)
- 각 함수는 public, internal, private으로 정의하여 사용할때 어떻게 표시되는지 확인을 위함
Tip) Xcode에서는 프레임워크 표시를 노란 상자로 표현하므로 이점을 확인
- Xcode command line인 xcodebuild archive 명령어를 통해 시뮬레이터를 포함한 디바이스 타겟을 여러개로하여 아카이빙
- 추가로, SKIP_INSTALL=NO로 설정 - $(DSTROOT)$(INSTALL_PATH) 경로에 설치까지 하는 옵션
(YES이면 설치는 안하고 빌드만 수행)
- iOS, Simulator, Mac 세 가지 타겟으로 아카이빙 (.ipa파일이 아닌 .xarchive파일임을 주의)
xcodebuild archive -scheme ExSample -archivePath "./build/ios.xcarchive" -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive -scheme ExSample -archivePath "./build/ios_sim.xcarchive" -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive -scheme ExSample -archivePath "./build/mac.xcarchive" -sdk macosx10.15 SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES
현재 Mac OS 관련 이슈가 있어서, Mac 아카이빙만 실패하고 나머지 iOS와 시뮬레이터는 아카이빙 성공
- xarchive파일은 디렉토리이며 프레임워크는 안에 존재
ios_sim.xarchive/Products/Libraray/Frameworks/ExSample.framework
ios.xarchive/Products/Libraray/Frameworks/ExSample.framework
- ipa파일을 가지고 framework를 생성 후 XCFramework도 생성
- ExSample 프레임워크로 생성
- ExSample.xcframework로 묶기
xcodebuild -create-xcframework \
-framework "./build/ios.xcarchive/Products/Library/Frameworks/ExSample.framework" \
-framework "./build/ios_sim.xcarchive/Products/Library/Frameworks/ExSample.framework" \
-output "./build/ExSample.xcframework"
// mac버전도 지원해야한다면, 아래 명령어도 추가
-framework "./build/mac.xcarchive/Products/Library/Frameworks/ExSample.framework" \
- ExSample.xcframework 폴더 생성
XCFramework 사용 방법
- 사용하려는 프로젝트에 해당 프레임워크를 추가하여 사용
- 위에서 만든 xcframework를 사용할 테스트 프로젝트 생성
- ExTest/ExTest하위에서 프레임워크를 관리하기위해 Frameworks 폴더 생성
- Frmaework 폴더 안에 위에서 만든 .xcframework 파일 넣기
- 폴더를 생성하고 XCode에도 드래그 엔 드롭
- Dynamic Framework이므로 embed 시켜주기 (embed시켜주는 이유는 아래에서 설명)
- ExSample에서 Code Signing을하지 않았으므로 ExText에서 Code Signing이 필요 - Embed & Sign선택
- import ExSample 후 프레임워크 안에있는 a1() 실행하여 프레임워크에 있는 함수 사용 테스트
import UIKit
import ExSample
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
a1() // a1!
}
}
- 테스트 프로젝트에서 프레임워크 프로젝트 안에 가보면 public이라도 구현체가 숨겨져 있는것을 확인
- Targets > Build Phases > Link Binary With Libraies에서 ExSample.xcframework가 Required 되어있는 것을 확인
cf) 아래와 같이 framework 관련 설정을 할 수 있는 곳이 2가지 존재 (해당 개념은 이 포스팅 글 참고)
1) Target > Build Settings > Linking > Mach-O Type (프레임워크를 제공하는 쪽에서 선택해줘야하는 옵션)
중요) Framework 종류 선택
- Dynamic Framework: 리소스를 스스로 가지고 있거나 전체 소스를 제공 (framework로 프로젝트 생성시 default)
- Static Framework: 전체 소스를 제공하지 않고 SDK 형태로 배포하는 경우
2) Target > General > Frameworks, Libraries, and Embeded Content의 Embed 옵션
- 프레임워크를 사용하는쪽에서 선택해줘야하는 옵션
* 전체 코드
- ExSample (프레임워크 프로젝트) - https://github.com/JK0369/ExSample
- ExTest (테스트 프로젝트) - https://github.com/JK0369/ExTest
* 참고
https://www.simpleswiftguide.com/how-to-add-xcframework-to-xcode-project/
https://help.apple.com/xcode/mac/11.4/#/dev51a648b07
https://help.apple.com/xcode/mac/11.4/#/dev6f6ac218b
https://developer.apple.com/videos/play/wwdc2019/416/
https://appspector.com/blog/xcframeworks