IOS

[Xcode] SPM Package 내부에서 CustomFont 사용하기

clamp 2024. 11. 27. 20:34

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시간...