Framework를 배포하는 방법으로는 XCFramework, SPM, CocoaPods 등이 있습니다.
An XCFramework is a distributable binary package created by Xcode that contains variants of a framework or library so that it can be used on multiple platforms (iOS, macOS, tvOS, and watchOS), including Simulator builds. An XCFramework can be either static or dynamic and can include headers.
To use a prebuilt XCFramework, link the target to the XCFramework. Xcode ensures that the target can build against the XCFramework’s headers, link against its binary, and embed it for distribution. If your app has multiple targets (such as app extensions) that use the same XCFramework, you should pick one target (usually your app’s target) to embed the XCFramework and the others should link it without embedding.
XCFramework는 여러 플랫폼(iOS, macOS, tvOS, watch + Simulator 빌드)에서 사용할 수 있도록 생성된 배포 가능한 binary package 입니다.
XCFramework는 정적과 동적 모두 될 수 있고, 헤더를 포함할 수 있습니다.구축되어있는 XCFramework를 사용하려면, 타겟을 XCFramework에 연결하세요.
Xcode는 타겟이 XCFramework의 헤더를 기반으로 구축하고, binary를 기반으로 연결하여 배포할 수 있도록 보장합니다.
만약 앱이 여러 타겟일 때 같은 XCFramework를 사용한다면, 하나의 타겟을 골라 XCFramework를 embed하고 다른 타겟들은 연결만 시킵니다.(without embedding)쉽게말해, Framework를 하나의 묶음으로 만든 Container Frmaework 입니다.
자 그럼 만들어봅시다!
먼저, Framework 프로젝트의 Build Setting에서
아래와 같은 명령어를 터미널에 입력해줍니다.
xcodebuild archive\
-project [프레임워크 파일 경로]\
-scheme [Archive 하고자하는 target scheme 명]\
-destination 'generic/platform=iOS'\
-archivePath [아카이브 파일 경로]
💪예시
xcodebuild archive\
-project /Users/jiheehwang/Desktop/JiheeFramework/JiheeFramework.xcodeproj\
-scheme JiheeFramework\
-destination 'generic/platform=iOS'\
-archivePath /Users/jiheehwang/Desktop/Archives/JiheeFramework-iOS.xcarchive
💡 유의사항
- Destination은 입력 값에 따라, 다른 종류의 Archive File을 생성합니다.
- iOS : 'generic/platform=iOS'
- iOS Simulator: 'generic/platform=iOS Simulator'
- Mac OS : 'generic/platform=macOS'
- ArchivePath 입력시, 생성될
.xcarchive
파일의 이름까지 명시해주어야합니다.
xcarchive 파일들을 하나의 Bundle로 묶어줍니다.
xcrun xcodebuild -create-xcframework \
-framework '[앞서 만든 xcarchive1 경로]/Products/Library/Frameworks/JiheeFramework.framework' \
-framework '[앞서 만든 xcarchive2 경로]/Products/Library/Frameworks/JiheeFramework.framework' \
-output '[xcframework를 저장할 경로]'
💪예시
xcrun xcodebuild -create-xcframework \
-framework '/Users/jiheehwang/Desktop/Archives/JiheeFramework-iOS.xcarchive/Products/Library/Frameworks/JiheeFramework.framework' \
-framework '/Users/jiheehwang/Desktop/Archives/JiheeFramework-iOS-Simulator.xcarchive/Products/Library/Frameworks/JiheeFramework.framework' \
-output '/Users/jiheehwang/Desktop/Archives/JiheeFramework.xcframework'
💡 유의사항
framework
는 생성한 xcarchive, 즉 Bundle에 묶일 xcarchive File 수 만큼 적어줍니다.- output 입력시, 생성될 .xcframework 파일의 이름까지 명시해주어야합니다.
마지막 ! XCFramework에 서명을 해줍니다!
codesign --timestamp -s [*인증서] [생성한 xcframework 경로]
💪예시
codesign --timestamp -s AAAAAAAAAA /Users/jiheehwang/Desktop/Archives/JiheeFramework.xcframework
💡 인증서?
- Mac 키체인에 존재하는 Apple Distribution 또는 Apple Development 인증서
- 인증서가 여러개여도, codesign이 하나의 인증서만 식별하면 되기때문에 하나만 입력하면 됩니다!
_CodeSignature
파일이 생성됩니다!앞서 만든 Framework 프로젝트 (XCFramework 아님) 와 달리, Add Files to ”” …
로 추가하지 않습니다.
빌드해보면.. ! 적용 완료 !
App에서 Framework의 설정이나 코드 수정이 가능했는데, 왜 되는지 알 수 없었습니다 ..
App에서 설정을 변경한다고 Framework의 설정이 바뀌어버리는건 맞지 않다는 생각이 들었고,
Add Files to 이 아닌 외부 Framework이라면 수정이 막히지 않을까 ? 하는 궁금증이 생겼습니다.
XCFramework를 생성해 프로젝트에 연결시키면
아래 이미지와 같이 Framework의 코드에 접근해 사용이 가능하지만, 코드 전체를 볼 수 없습니다.
코드에서 Jump to definition 을 통해야만 해당 코드로 접근이 가능합니다.
타고 들어가 Framework의 코드를 수정!
… 프레임워크에 해당 수정이 반영되어있는걸 확인 .. ^^
…… SPM으로 배포해 Git 연동을 해보자 .. Github 주소로 프레임워크를 추가하면, 단순히 읽기만 가능하게 링크된다 합니다 ..
그래서 다음편은 SPM으로 XCFramework 배포하기
가 되겠습니다 !
참고문서
Creating a multiplatform binary framework bundle
What is an XCFramework?
Binary Frameworks in Swift
Overview of Dynamic Libraries