24.10.22 수정: Cocoapods 라이브러리를 XCFramework로 묶어서 사용하기
1편 Static Library 만들기
[iOS] Swift Static Library 만들기(Device, Simulator)
최근에 Memoji Collector의 코드를 Git에 올리면서 두 가지 애로사항이 생겼다. - 일부 파일을 숨기고 싶다. - 하지만 다른 사람들이 내 레포의 fork나 clone을 통해 빌드가 가능했으면 좋겠다. 그러던 중
littlemoom.tistory.com
2편 Static Framework 만들기(Universal) - 삽질 구간
[iOS] Swift Static Framework 만들기(Universal) - 1. 삽질 구간
[iOS] Swift Static Library 만들기(Device, Simulator) 최근에 Memoji Collector의 코드를 Git에 올리면서 두 가지 애로사항이 생겼다. - 일부 파일을 숨기고 싶다. - 하지만 다른 사람들이 내 레포의 fork나 clo..
littlemoom.tistory.com
드디어 XCFramework까지 왔다.
Framework는 안 되는데 XCFramework는 왜 될까?
https://help.apple.com/xcode/mac/11.4/#/dev6f6ac218b
To see this page, you must enable JavaScript. Pour afficher cette page, vous devez activer JavaScript. Zur Anzeige dieser Seite müssen Sie JavaScript aktivieren. このページを表示するには、JavaScript を有効にする必要があります。
help.apple.com
XCFramework는 Apple 여러 플랫폼에서 사용가능한 Framework의 형태인데, Simulator까지도 통합 지원한다!
최근 Tuist를 활용해서 프로젝트를 관리 중이다.
Cocoapods의 시대는 끝이났지만, 아직 라이브러리들을 완벽히 분리할 수 없기에 우선 XCFramework로 묶어서 관리하려고 한다.
이제 만들어보자!
0. 환경
Xcode 15.2
CPU: M1 Pro
1. Create Projcet

Framework 프로젝트를 하나씩 만들어주자
2. Cocoapods Install
Cocoapods을 추가해줍니다.
만약 Cocoapods을 사용하지 않고, 개인 Framework를 사용한다면 바로 4단계로 넘어가도 됩니다.

3. Wrapping Code
Cocoapods 라이브러리들을 Wrapping 하기 위한 코드가 필요합니다.
이 단계에서는 각자 프로젝트에 맞도록 Wrapping을 해주면 됩니다.
저의 경우 라이브러리 별로 Group 혹은 File을 생성해서 typealias 혹은 Wrapping Class를 사용했습니다.
4. Project Setting
코드를 작성했다면, Build Settings에서 Build Libraries for Distribution을 YES로 바꿔줍니다.

이제 빌드하자!
Trouble Shooting
1. Cocoapods
clang: error: SDK does not contain 'libarclite' at the path '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a'; try increasing the minimum deployment target
빌드 시 이와 같은 오류와 함께 빌드 실패
Cocoapods의 Build Target 버전이 너무 낮게 설정되어 있는 경우 발생하는 문제이다.
libarclite_iphoneos.a은 ARC를 지원하기 위한 라이브러리이다.
하지만 Xcode 14.3 부터 해당 파일을 사용하지 않기 때문에 빌드에 문제가 생긴 것이다.
따라서 Podfile에 아래 버전 구문을 추가하여 해결
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '17.0'
end
end
end
end
2. User Script Sandboxing
Sandbox: bash(11430) deny(1) file-write-create {PROJECT_PATH}/PDCocoaPods/Pods/resources-to-copy-PDCocoaPods.txt
빌드 시 이와 같은 오류와 함께 빌드 실패
User Script Sandboxing는 빌드 과정 중 Run Script 단계에서 스크립트가 접근할 수 있는 파일과 디렉토리를 제한하는 기능을 제공한다.
스크립트가 명시적으로 선언된 입력 및 출력 파일만을 사용할 수 있도록 강제하여, 스크립트가 의도치 않게 프로젝트의 다른 파일이나 빌드 중간 산출물에 접근하는 것을 방지한다.
Xcode14 이상에서 발생할 수 있다.
Framework Target -> Build Settings -> User Script Sandboxing -> No 로 해결

5. xcarchive 만들기
터미널에서 프로젝트 디렉토리로 이동하고 아래 명령을 실행합니다.
# iOS Device 용
xcodebuild archive \
-workspace "PDCocoaPods.xcworkspace" \
-scheme "PDCocoaPods" \
-destination "generic/platform=iOS" \
-archivePath "./build/PDCocoaPods.xcarchive" \
-configuration Release \
ARCHS="arm64" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# iOS Simulator 용
xcodebuild archive \
-workspace "PDCocoaPods.xcworkspace" \
-scheme "PDCocoaPods" \
-destination "generic/platform=iOS Simulator" \
-archivePath "./build/PDCocoaPods_Simulator.xcarchive" \
-configuration Release \
ARCHS="x86_64 arm64" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# ARCHS에 armv7(iOS 10 이하 버전 지원), i386(iOS 9 이하 Simulator) 사용가능
Architecture 값에 실제 기기 용은 arm64을
Simulator 용은 arm64과 x86_64의 값을 넣습니다.
6. XCFramework 만들기
xcodebuild -create-xcframework \
-framework ./build/PDCocoaPods.xcarchive/Products/Library/Frameworks/PDCocoaPods.framework \
-framework ./build/PDCocoaPods_Simulator.xcarchive/Products/Library/Frameworks/PDCocoaPods.framework \
-output ./build/PDCocoaPods.xcframework
# xcframework successfully written out to: {PATH}/PDCocoaPods/build/PDCocoaPods.xcframework
드디어 XCFramework를 마주하게 됐습니다.
7. Import XCFramework
이제 App 프로젝트에 Import 봅시다.

잘 인식하는 듯 합니다.

시뮬레이터에서도 실제 기기에서도 잘 작동하는 것을 확인할 수 있습니다.
또한 Rosetta Simulator에서도 잘 작동하는 것까지도 확인이 되었습니다.
'iOS > iOS' 카테고리의 다른 글
[iOS] Project & Workspace (1) | 2024.10.07 |
---|---|
[iOS] Target & Scheme (2) | 2024.09.30 |
[iOS] Xcode 15 Rosetta (0) | 2024.01.30 |
[iOS] CI/CD 환경 구축하기 - 2. fastlane match & CI/CD in Git Actions (0) | 2024.01.12 |
[iOS] CI/CD 환경 구축하기 - 1. Tuist in Git Actions & fastlane (0) | 2024.01.09 |