创建包含其他静态框架的iOS静态框架时,遇资源包查找错误求解决
iOS静态框架嵌套资源包找不到的解决方案
问题根源在于静态框架A打包时,并未将依赖框架B的资源包正确关联或嵌入到最终的App项目中——静态库本身不会自动包含依赖的资源文件,需要手动处理资源的归属路径。
以下是针对性的解决方法:
方法一:手动嵌入依赖框架的资源包
- 找到PhoneNumberKit的资源包
PhoneNumberKit_PhoneNumberKit.bundle,通常位于PhoneNumberKit的构建产物目录或包安装路径中。 - 将该资源包直接拖入App项目,确保在Target Membership中勾选App目标,同时在App的Build Phases > Copy Bundle Resources列表中确认包含该资源包。
- 重新构建运行App,此时App可直接访问到该资源包。
方法二:在静态框架A中添加脚本自动复制资源
- 在静态框架A的Xcode项目中,新增一个Run Script构建阶段,添加以下脚本将PhoneNumberKit的资源包复制到框架输出目录:
PHONE_NUMBER_KIT_BUNDLE_PATH="${BUILT_PRODUCTS_DIR}/PhoneNumberKit_PhoneNumberKit.bundle" if [ -d "$PHONE_NUMBER_KIT_BUNDLE_PATH" ]; then cp -R "$PHONE_NUMBER_KIT_BUNDLE_PATH" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Resources/" fi - 重新构建静态框架A,此时生成的
.framework文件的Resources目录已包含目标资源包。 - 将该框架拖入App项目后,确保框架的Embed设置为Do Not Embed(静态框架无需嵌入),并检查App的Copy Bundle Resources是否自动包含了框架内的资源包,未自动添加则手动拖入。
方法三:调整资源包的查找逻辑(需修改依赖框架代码)
若有权限修改PhoneNumberKit的代码,可调整resource_bundle_accessor.swift中的资源查找逻辑,优先从主App包中定位资源:
private class BundleFinder {} extension Foundation.Bundle { static var module: Bundle = { let bundleName = "PhoneNumberKit_PhoneNumberKit" // 优先从主App包查找资源 if let mainBundlePath = Bundle.main.path(forResource: bundleName, ofType: "bundle"), let bundle = Bundle(path: mainBundlePath) { return bundle } // 原有逻辑作为降级方案 let bundle = Bundle(for: BundleFinder.self) guard let url = bundle.url(forResource: bundleName, withExtension: "bundle") else { fatalError("unable to find bundle named \(bundleName)") } return Bundle(url: url)! }() }
关于之前尝试无效的原因说明
- 使用PhoneNumberKit非静态包:由于框架A是静态库,依赖的动态库无法被静态框架正确打包到App中,导致资源路径混乱。
- 将TheFramework设置为Embed And Sign:静态框架不需要Embed操作,该设置会引发重复或错误的资源关联,反而加重问题。
内容的提问来源于stack exchange,提问作者GruntBiscuits
相关产品推荐
相关产品推荐

