Framework 배포하기

Jee.e (황지희)·2023년 11월 19일
1

모듈화의 여정

목록 보기
3/4

Framework를 배포하는 방법으로는 XCFramework, SPM, CocoaPods 등이 있습니다.

🛠️ XCFramework 만들어보기

What is an XCFramework?

참고 문서

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 입니다.

자 그럼 만들어봅시다!


1. Set up the project

먼저, Framework 프로젝트의 Build Setting에서

  • Build Libraries for Distribution 을 Yes 로 설정합니다.
  • Skip Install 을 NO 로 설정합니다. (빌드된 결과물을 Archive file에 넣기 위해)

2. Create archives for frameworks or libraries

아래와 같은 명령어를 터미널에 입력해줍니다.

  • 명령어
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 파일의 이름까지 명시해주어야합니다.

ARCHIVE SUCCEEDED 가 뜨면 성공!

  • 저는 iOS Simulator 지원을 위해 하나의 xcarchive를 더 생성해주었고,
    성공적으로 생성이 되었다면 아래와 같이 Archives 폴더에서 확인이 가능합니다!

3. Generate the XCFramework bundle

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 파일의 이름까지 명시해주어야합니다.
  • 아래와 같은 Log가 뜨면 성공 !

4. Sign the XCFramework bundle

마지막 ! 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 ”” … 로 추가하지 않습니다.

  • General ➡️ Frameworks, Libraries, and Embedded Content 설정
    • 아래 이미지와 같이 Add Files를 누르고
    • 앞서 만든 XCFramework를 넣어줍니다. (파일 선택 후 Open)
    • 그럼 이렇게 잘 들어가져있는게 확인이 됩니다 !
  • Build Phases ➡️ Link Binary With Libraries 설정
    - Status를 Required로 설정해줍니다. (Default로 설정이 되어있긴 합니다!)

빌드해보면.. ! 적용 완료 !


이로써 앞서 생겼던 궁금증도 해결이 됐네요 홀홀

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

profile
교훈없는 경험은 없다고 생각하는 2년차 iOS 개발자입니다.

0개의 댓글