[SDK 개발] Framework, Static Library, XCFramework

1. 라이브러리가 앱에 붙는 두 가지 방식

라이브러리는 앱 바이너리에 붙는 시점에 따라 둘로 나뉜다.

1️⃣ Static Library (.a)

빌드 시점에 코드가 앱 실행파일 안으로 복사된다.

앱 바이너리와 한 몸이 되니 로딩이 빠르고 파일이 하나지만, 이미지/스토리보드 같은 리소스를 담을 수 없다.

(코드 덩어리일 뿐 번들이 아님)

2️⃣ Dynamic Framework (.framework)

앱과 별도 파일로 존재하고 실행 시점에 로드된다.

정확히는 “framework”는 포장 형식이고 안에 든 바이너리가 dynamic library이다. 번들이라서 리소스, 헤더, 그리고 Swift의 모듈 정보까지 담을 수 있다.

BrandGiftWebViewKit.framework/
  ├── BrandGiftWebViewKit        ← 실제 바이너리
  ├── Headers/                   ← (ObjC 호환용) 공개 헤더
  ├── Modules/
  │   └── BrandGiftWebViewKit.swiftmodule/   ← Swift 모듈 정보 ★ 핵심
  └── Info.plist

우리 SDK는 웹뷰 화면(UI)를 포함하니 framework 포장이 자연스럽다.

참고로 framework 안에 static library를 넣는 것도 가능해서 (static framework)

포장 = framework, 링킹 = static/dynamic 선택으로 분리해서 이해!

2. 그냥 .framework를 zip해서 주면? 안된다

1️⃣ 첫 번째 균열: 아키텍처

빌드 산출물은 CPU 아키텍처별로 다르다.

실기기는 arm64, 시뮬레이터는 인텔 맥에서 x86_64, 옛날에는 lipo로 두 아키텍처를 한 바이너리에 욱여넣는 fat binary 를 만들어 배포했다.