최근에 Memoji Collector의 코드를 Git에 올리면서 두 가지 애로사항이 생겼다.
- 일부 파일을 숨기고 싶다.
- 하지만 다른 사람들이 내 레포의 fork나 clone을 통해 빌드가 가능했으면 좋겠다.
그러던 중에 Static Library라는 단어가 잊을만 하면 어디선가 자꾸 들려와서 시도해봤다.
iOS 앱을 기준으로 작성해보았다.
프로젝트 만들기
라이브러리를 적용할 App 프로젝트와 라이브러리를 만들 프로젝트를 각각 만들어준다.


각각 만들어주면 된다.
참고로 App 프로젝트에서 Core Data와 Test는 안 쓸거라 Use Core Data, Include Tests는 체크를 안 하고 했다.
라이브러리 폴더 생성

lib이란 이름으로 라이브러리 파일을 넣을 폴더를 생성해줬다.
App 프로젝트 설정
App -> Targets App -> Build Settings -> Select All, Combined에서
두 가지 Paths를 설정해준다.


$(inherited)
$(PROJECT_DIR)
$(PROJECT_DIR)/lib
위 세줄을 적어주면 된다.
Library Code 작성
앱에서 사용할 라이브러리 코드를 작성한다.
여기서는 SwiftUI에서 사용하는 Button을 CustomButton이란 이름으로만 바꿔주는 작업을 했다.
// CustomButton.swift
import SwiftUI
public struct CustomButton<L> : View where L : View {
let role: ButtonRole?
let action: () -> Void
let label: () -> L
public init(role: ButtonRole? = .none, action: @escaping () -> Void, @ViewBuilder label: @escaping () -> L) {
self.role = role
self.action = action
self.label = label
}
public var body: some View {
Button(role: self.role) {
self.action()
} label: {
self.label()
}
}
}
코드를 작성할 때 접근 제어 키워드가 중요하다.
init에 public 키워드를 안 쓰니 앱에서 사용할 때 초기화 함수에 접근할 수 없다는 에러를 만났다.
Build Library
라이브러리 코드가 완성이 되면, 두 가지 버전으로 빌드해준다.


실제 Device or Any iOS Device로 실제 Device용 빌드를 진행하고,
아무 Simulator(iOS 기반 기기)를 선택한 뒤에 Simulator용 빌드를 진행한다.
Library File 확인

Product -> Show Build Folder in Finder를 통해 빌드가 잘 됐는지 확인할 수 있다.

iphoneos과 iphonesimulator가 있으면 빌드가 잘 된것이다!
Debug라고 나온 것은 Build Scheme 설정에 따라 다르게 나오는데, 실제 앱에서 사용하는 데에는 변수가 안되는 듯 하다.

Library 추가

이제 생성된 라이브러리를 아까 만든 lib 폴더에 복사한다.
빌드 테스트를 하는 환경(Device or Simulator)에 따라 골라서 복사하면 된다.


App 프로젝트에서 Add Files to 를 통해 lib 폴더를 추가한다.
Build Test
import SwiftUI
import StaticLibrary
struct ContentView: View {
var body: some View {
VStack{
Text("Hello, world!")
CustomButton{
print("Custom Button in Library")
} label: {
Text("Static Library Button")
}
}
}
}
실제로 코드를 작성해보고 Build가 되는지 확인한다.

Issue
Build는 잘 되는데, 경고가 아닌 Error가 나와서 뭔가 했더니,

x86_64용 빌드 Target을 못찾겠다고 나온다.
해당 파일로 Intel 맥에서 빌드했을경우 실패할 가능성이 충분히 있다는 의미기도 하다.
아마 내 Git Repo의 코드를 Intel맥에서 빌드하면...
Improvement
현재는 빌드 대상이 실제 Device인지 Simulator인지에 따라 바이너리 파일을 계속 바꿔줘야한다.
구글링을 해보니 두개의 바이너리 파일을 합치는 방법이 있기는 한데 시도해본 결과 여러가지 이유로 안 된다.
- lipo 사용
M1 CPU에서 빌드를 해서 그런지 Simulator의 Build Target Architecture가 arm64로 잡히고, Device의 Architecture도 arm64이다. 그러다보니 두개의 Target Architecture가 같다는 이유로 바이너리 파일이 합쳐지지 않는다.
- Aggregate 사용
Script를 사용해서 합치는 방식인데 결국 Script안에 lipo가 있었다.
바이너리가 합쳐지긴 하는데, Simulator에서만 빌드가 되고, Device에서는 못한다.
동시에 빌드할 수 있는 방법을 찾고 싶은데 바이너리 자체를 뜯어보기엔 아직 지식이 부족하다.
지금은 숙제로 남겨둬야할거같다.
Git Repository
GitHub - moonjs0113/iOS-Static-Library-Example
Contribute to moonjs0113/iOS-Static-Library-Example development by creating an account on GitHub.
github.com
'iOS > iOS' 카테고리의 다른 글
[iOS] Tuist - 3. Target 생성 (0) | 2023.02.03 |
---|---|
[iOS] Tuist - 2. 프로젝트 파일 정리 (0) | 2023.02.02 |
[iOS] Tuist - 1. XcodeGen에서 Tuist로 (0) | 2023.02.02 |
[iOS] Swift Static Framework 만들기(Universal) - 1. 삽질 구간 (0) | 2022.07.16 |
[iOS] Bitcode(feat. App Thinning) (0) | 2022.04.19 |