You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:43:14