라이브러리는 앱 바이너리에 붙는 시점에 따라 둘로 나뉜다.
.a)빌드 시점에 코드가 앱 실행파일 안으로 복사된다.
앱 바이너리와 한 몸이 되니 로딩이 빠르고 파일이 하나지만, 이미지/스토리보드 같은 리소스를 담을 수 없다.
(코드 덩어리일 뿐 번들이 아님)
.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 선택으로 분리해서 이해!
빌드 산출물은 CPU 아키텍처별로 다르다.
실기기는 arm64, 시뮬레이터는 인텔 맥에서 x86_64, 옛날에는 lipo로 두 아키텍처를 한 바이너리에 욱여넣는 fat binary 를 만들어 배포했다.