如何创建含CocoaPods依赖的XCFramework?解决模块找不到问题
首先明确:XCFramework本身不会自动打包CocoaPods依赖,你遇到的报错是因为SDK的接口文件(.swiftinterface)直接引用了第三方模块,但测试新项目未引入这些依赖。针对闭源SDK通过CocoaPods分发的场景,有两种可行方案:
方案一:通过Podspec声明依赖(推荐)
这是CocoaPods分发SDK的标准做法,无需将依赖打包进XCFramework,而是让CocoaPods自动管理依赖链:
修改私有Podspec文件,添加SDK所需的依赖声明:
Pod::Spec.new do |s| s.name = "My_Framework_Name" s.version = "1.0.0" s.summary = "你的闭源SDK描述" s.homepage = "你的SDK主页" s.license = { :type => "Commercial", :text => "商业许可" } s.author = { "你的名字" => "你的邮箱" } s.platform = :ios, "13.0" # 指定XCFramework的本地/远程路径 s.vendored_frameworks = "build/my-framework-name.xcframework" # 添加依赖声明,比如AWSCognitoIdentityProvider s.dependency "AWSCognitoIdentityProvider" # 如有其他依赖,继续追加 # s.dependency "OtherThirdPartyPod" end验证并发布Podspec:
执行pod lib lint验证Podspec格式与依赖合法性,确认无报错后推送到你的私有Pod仓库。新项目测试:
在新项目Podfile中添加私有仓库地址与SDK依赖,执行pod install后,CocoaPods会自动拉取XCFramework及所有声明的依赖,编译时就不会再出现模块找不到的错误。
方案二:将依赖静态打包进XCFramework(不推荐,仅特殊场景使用)
如果必须让XCFramework包含所有依赖(比如不让使用者额外引入依赖),需要手动将依赖合并到SDK中:
将CocoaPods依赖编译为静态库/XCFramework:
针对每个依赖(如AWSCognitoIdentityProvider),单独编译为支持多架构的静态库,或用Carthage等工具拉取并编译为XCFramework。修改SDK的Xcode配置:
- 将SDK的
Build Settings中Mach-O Type设置为Static Library。 - 将依赖的静态库/XCFramework添加到项目的
Link Binary With Libraries,并设置Embed & Sign为正确选项。
- 将SDK的
重新生成XCFramework:
分别编译模拟器、真机版本的SDK(此时依赖代码会合并到SDK二进制中),再用xcodebuild -create-xcframework命令生成最终文件。
注意:这种方式会大幅增加XCFramework体积,可能违反第三方依赖的开源许可,且后续依赖版本升级需重新编译SDK,维护成本极高,仅适合极端场景。
关键注意事项
- 尽量避免在SDK的公开接口(.swiftinterface)中直接暴露第三方依赖的类型,若无法避免,方案一是唯一合规且易维护的选择。
- 生成XCFramework时,确保模拟器、真机版本的SDK编译配置完全一致(如链接方式、最低系统版本),避免兼容性问题。
内容的提问来源于stack exchange,提问作者thesuffering

