관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 3. 모듈화 개념 - XCFramework 생성, 사용 방법 본문

iOS 응용 (swift)

[iOS - swift] 3. 모듈화 개념 - XCFramework 생성, 사용 방법

jake-kim 2022. 6. 14. 23:06

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 생성, 사용 방법

4. 모듈화 개념 - Tuist로 프로젝트 관리 방법

XCFramework 개념

  • 시뮬레이터 빌드를 포함하여 여러 플랫폼 (iOS, macOS, tvOS, watchOS)에서 사용할 수 있도록 Xcode에서 만든 배포 가능한 바이너리 패키지

Mac OS를 위한 AppKit과 iOS를 위한 UIKit도 하나의 프레임워크로 제공가능 (Client가 Mac OS든 iOS든 동작)

  • XCFramework는 Static Framework이거나 Dynamic Framework 둘 다 가능
  • 원래 Static Framework는 Bundle화만 할 수 있었지만, XCFramework에서는 header와 함께 Bundling이 가능
  • 애플 문서에 따르면, 앱에 동일한 XCFramework를 사용하는 여러개가 있는 경우일때는 반드시 하나만을 링크하도록 설정해야함
  • XCode에서 XCFramework를 사용하는 곳은 아래처럼 Target -> General -> Frameworks 탭에 존재

https://help.apple.com/xcode/mac/11.4/#/dev51a648b07

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 파일

  • xarchive파일은 디렉토리이며 프레임워크는 안에 존재
     ios_sim.xarchive/Products/Libraray/Frameworks/ExSample.framework
     ios.xarchive/Products/Libraray/Frameworks/ExSample.framework

tree명령어로 ios_sim 프레임워크 형태 확인

  • 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

 

Comments