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文件放到目标目录下,按如下方式配置:
- 将原
fonts目录直接放到iosMath目标的源码目录下 - 修改Package配置:
.target( name: "iosMath", resources: [.process("fonts")]),
- 修改原有资源加载代码,直接从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
相关产品推荐
相关产品推荐

