Xcode 15构建后自定义字体随机渲染异常求助
iOS 17 + Xcode 15 自定义字体随机失效问题
设备升级至iOS 17(或使用Xcode 15构建,暂未明确)后,应用中的自定义字体开始出现随机失效问题,通常发生在App进入后台一段时间后。已知Xcode 15在Interface Builder中存在字体问题,但我们完全未使用该工具。
具体现象
- 字体完全不加载,图标字体显示为大量问号;
- 字体错乱,常规文本(Roboto自定义字体)使用图标字体(Font Awesome)渲染。
注:该现象在iOS 16构建版本中未出现,且未修改过字体逻辑;使用Xcode14构建的iOS17版本也无此问题。尝试模拟器内存警告未触发该问题,且无法复现以调试。
调试环境
- Xcode版本:15.0.1 (15A507)
- iOS版本:17.1.1(仅真机出现,模拟器未观测到)
字体加载实现
我们通过私有SPM包加载自定义字体,相关注册代码如下:
fileprivate static func registerFont(fontName: String, ext: String = "otf") { guard let fontURL = Bundle.module.url(forResource: fontName, withExtension: ext), let fontDataProvider = CGDataProvider(url: fontURL as CFURL), let font = CGFont(fontDataProvider) else { fatalError("Couldn't create font from filename: \(fontName).\(ext)") } var error: Unmanaged<CFError>? CTFontManagerRegisterGraphicsFont(font, &error) } public static func registerFonts() { registerFont(fontName: "Font Awesome 6 Brands-Regular-400") registerFont(fontName: "Font Awesome 6 Duotone-Solid-900") registerFont(fontName: "Font Awesome 6 Pro-Light-300") registerFont(fontName: "Font Awesome 6 Pro-Regular-400") registerFont(fontName: "Font Awesome 6 Pro-Solid-900") registerFont(fontName: "Font Awesome 6 Pro-Thin-100") registerFont(fontName: "Font Awesome 6 Sharp-Light-300") registerFont(fontName: "Font Awesome 6 Sharp-Regular-400") registerFont(fontName: "Font Awesome 6 Sharp-Solid-900") registerFont(fontName: "Roboto-Medium", ext: "ttf") registerFont(fontName: "Roboto-Regular", ext: "ttf") registerFont(fontName: "RobotoMono-Regular", ext: "ttf") } // 所有字体类型和图标均使用类似方法获取 @objc public static func getDefaultFont(size: CGFloat) -> UIFont { return UIFont.init(name: "Roboto-Regular", size: size) ?? UIFont.systemFont(ofSize: size); }
该代码在didFinishLaunching中调用,加载失败会导致App崩溃:
FontHandler.registerFonts()
我们完全通过代码使用字体(无故事板或xib),字体加载示例如下:
let label = UILabel() label.font = FontHandler.getDefaultFont(size: 15)
字体文件随SPM包一同分发(存于Fonts文件夹),SPM配置代码如下:
import PackageDescription let package = Package( name: "MyPackageName", defaultLocalization: "en", platforms: [ .iOS(.v11) ], products: [ .library( name: "MyPackageName", targets: ["MyPackageName"]), ], targets: [ .target( name: "MyPackageName", resources: [ .process("Fonts") // 字体资源配置 ]), .testTarget( name: "MyPackageNameTests", dependencies: ["MyPackageName"]), ] )
问题推测
App启动时所有字体均正常,重启即可恢复,结合字体错乱现象,推测为字体缓存相关Bug。
内容的提问来源于stack exchange,提问作者nickdnk
相关产品推荐
相关产品推荐

