SDK작업중 Font를 SPM Package에서 사용하기 위한 방법과 삽질을 남겨봅니다.
SPM Package의 구조입니다.
Package하위의 여러 모듈중 SDKCommon이라는 모듈의 일부입니다.
SDK 구조 가정
ClampSDK
- ClampSDKAuth // 모듈
- ClampSDKChat // 모듈
- ClampSDKCommon // 모듈
ㄴ Resources // ClampCommon모듈의 하위 폴더
ㄴ Fonts // Resources 폴더의 하위 폴더
ㄴ ttf파일
1. Package 파일에 Resources를 정의해줍시다
targets: [
.target(
name: "ClampSDKCommon",
resources: [
.process("Resources/Fonts")
]
)
]
이렇게만 정의해주면 SPM은 재귀적으로 하위 파일들을 찾아나갑니다.
SPM 공식문서 참고
2. 일반 프로젝트에서는 Font를 info.plist파일에 등록해주지만 코드로도 등록할 수 있습니다.
import Foundation
struct SDKCustomFontName {
static let kantumRuyProBold = "KantumruyPro-Bold"
static let kantumRuyProMedium = "KantumruyPro-Medium"
static let kantumRuyProRegular = "KantumruyPro-Regular"
static let kantumRuyProSemiBold = "KantumruyPro-SemiBold"
static var all: [String] {
[kantumRuyProBold, kantumRuyProMedium, kantumRuyProRegular, kantumRuyProSemiBold]
}
}
public struct SDKFonts {
public static func registerCustomFonts() {
SDKCustomFontName.all.forEach { font in
guard let url = Bundle.module.url(forResource: font, withExtension: "ttf") else {
return
}
CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil)
}
}
}
만약 SDK가 앱에서 사용된다면 앱에서 registerCutomFonts()를 SDK사용 전에 호출해주면 됩니다.
AppDelegate에서 하면 되겠죠
만약 Preview에서 보고싶다면?
public extension View {
func loadCustomFonts() -> some View {
SDKFonts.registerCustomFonts()
return self
}
}
#Preview {
MainView()
.loadCustomFonts()
}
이렇게 해주시면 됩니다.
삽질... 그리고 기록
폰트를 찾지 못한 이유
url이 항상 nil로 출력되는 문제
SDKCustomFontName들을 보면 .ttf 확장자까지 파일 이름에 넣었습니다.
그리고 bundle에서 resources들의 url을 찾고있는데 뒤에 extension에서 또 "ttf"를 입력해서..
폰트.ttf.ttf를 찾으니 못찾지
내 사라진 1시간...