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

Swift Package Manager清单如何正确引入mathFonts.bundle资源?

问题原因

你遇到的崩溃是因为 Swift Package Manager 的 .process 资源规则会自动拆解你传入的 .bundle 结构,将内部的字体、plist 等文件直接打包进当前 target 的模块 bundle 中,并不会保留 mathFonts.bundle 这个外层 bundle 结构,因此原有代码查找 mathFonts.bundle 的逻辑会返回空,最终崩溃。

解决方案

方案1:保留原有加载逻辑,仅修改Package配置

如果你不想改动原有Objective-C的资源加载代码,只需要把Package.swift中的资源规则从.process改成.copy即可,该规则会原样保留bundle的结构,不会做拆解处理:

.target(
    name: "iosMath",
    resources: [.copy("mathFonts.bundle")]),

修改后清理Xcode缓存重新编译,SPM会自动将完整的mathFonts.bundle打包到产物中,原有加载逻辑可以正常找到资源。

方案2:适配SPM原生资源管理规则(更推荐)

你可以去掉自行创建的mathFonts.bundle,直接把字体和plist文件放到目标目录下,按如下方式配置:

  1. 将原fonts目录直接放到iosMath目标的源码目录下
  2. 修改Package配置:
.target(
    name: "iosMath",
    resources: [.process("fonts")]),
  1. 修改原有资源加载代码,直接从SPM的模块bundle中读取资源:
    Objective-C中需要先引入自动生成的Swift头,再使用内置宏获取模块bundle:
#import <iosMath/iosMath-Swift.h>

// 获取模块bundle
NSBundle *moduleBundle = SWIFTPM_MODULE_BUNDLE;
// 直接从bundle中读取字体文件即可

该方式更符合SPM的资源管理规范,不需要额外维护自定义bundle结构。

注意事项
  • 确保mathFonts.bundle(或fonts目录)的存放路径和Package.swift中配置的路径一致,需要放在iosMath目标对应的源码根目录下
  • 若你的库需要支持iOS 11以下版本,需要确保使用Xcode 14及以上版本编译,旧版本Xcode的SPM资源管理不支持iOS 11以下的部署目标

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:06:04