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

如何访问CocoaPods中的字体?遇初始化nil及权限问题求助

解决CocoaPods自定义字体代码初始化返回nil+权限报错问题

我之前也踩过类似的坑,结合你的情况咱们一步步拆解解决:

先搞定框架权限报错

那个PUIElementModules91.framework的权限问题是核心阻碍之一,先把它解决:

  • 找到项目里Pods目录下的这个框架文件,右键「显示简介」,在「共享与权限」板块,确保当前登录用户有读/写权限;如果没有,点击右下角的锁解锁,添加用户权限并选择「应用到包含的项目」。
  • 嫌手动改麻烦的话,直接打开终端cd到项目根目录,执行:
    sudo chmod -R 755 ./Pods
    
    递归修改Pods目录下所有文件的权限,确保框架能被正常访问。

排查字体加载的核心问题

虽然你已经做了不少配置,但CocoaPods的字体加载有几个容易忽略的细节:

1. 确认Podspec的资源配置正确

很多人会漏写podspec里的资源声明,导致字体没被正确打包到pod中:

  • 如果字体直接放在pod的资源目录,确保podspec里有:
    s.resources = "YourPodName/Resources/Fonts/*.ttf"
    
    路径要和pod里字体的实际位置完全对应。
  • 更推荐用resource_bundles(避免和主app资源冲突),配置如下:
    s.resource_bundles = {
      "YourPodResources" => ["YourPodName/Resources/Fonts/*.ttf"]
    }
    
    这种情况下字体存在pod的独立资源bundle里,主app的bundle不会包含,需要手动注册字体。

2. 别把字体文件名当实际字体名称!

这是最常见的错误:你代码里用的my-fonts-name可能不是字体的真实名称。

  • 用Font Book打开你的TTF文件,顶部显示的名称才是代码里需要用的(比如文件名是MyFont-Regular.ttf,实际名称可能是MyFont Regular或者MyFont-Regular)。
  • 也可以在pod的初始化代码里先打印字体列表,确认是否加载成功:
    // 在pod的某个初始化方法里执行
    UIFont.familyNames.forEach { familyName in
        let fontNames = UIFont.fontNames(forFamilyName: familyName)
        print("[Pod Fonts] \(familyName): \(fontNames)")
    }
    

3. 手动注册字体(关键步骤)

如果字体在pod的资源bundle里,主app的info.plist配置不会生效,必须手动注册:
在你的pod里添加一个字体注册工具类:

public class YourPodFontLoader {
    public static func registerFonts() {
        let baseBundle = Bundle(for: YourPodFontLoader.self)
        // 如果用了resource_bundles,需要额外获取对应bundle:
        // guard let resourceBundleURL = baseBundle.url(forResource: "YourPodResources", withExtension: "bundle"),
        //       let podBundle = Bundle(url: resourceBundleURL) else {
        //     print("找不到pod资源bundle")
        //     return
        // }
        
        guard let fontURLs = baseBundle.urls(forResourcesWithExtension: "ttf", subdirectory: nil) else {
            print("找不到pod里的字体文件")
            return
        }
        
        for url in fontURLs {
            CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil)
        }
    }
}

然后在消费项目的AppDelegate或SceneDelegate的启动方法里调用:

YourPodFontLoader.registerFonts()

4. 复用Storyboard的字体名称

既然Storyboard能正常使用字体,你可以打开Storyboard,选中用了自定义字体的控件,查看属性检查器里的「Font」字段,里面显示的名称就是代码里UIFont(name:)需要传入的参数,直接复制过来用即可。

最后验证

做完以上步骤后,重新执行pod install,清理项目(Cmd+Shift+K),重新编译运行,再打印字体列表,应该就能看到你的自定义字体了,代码初始化也不会返回nil了。

内容的提问来源于stack exchange,提问作者user9661174

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:59:28