Xcode中Swift静态库二进制分发与集成No such module问题咨询
Swift 闭源 BLE 库分发方案(等效 C 的 .a+.h 模式)
针对内部使用、不上架App Store的场景,你可以采用苹果官方推荐的静态XCFramework作为闭源分发格式,无需暴露源码,对方集成和调用成本和C的.a+.h一致。
打包操作步骤如下:
- 打开你的库Xcode项目,进入库目标的「构建设置」页面,配置以下参数:
Mach-O Type设置为Static LibraryBuild Libraries for Distribution设置为YES(必选,用于生成Swift对外接口文件,替代C的.h头文件作用)Skip Install设置为NO
- 分别编译真机、模拟器两个架构的构建产物:
- 选中「真机设备」,按
Command + B完成编译 - 选中「任意模拟器」,按
Command + B完成编译
- 选中「真机设备」,按
- 执行命令打包多架构合一的XCFramework:
xcodebuild -create-xcframework -framework 真机编译输出的framework路径 -framework 模拟器编译输出的framework路径 -output kingpin_mobile_framework.xcframework - 最终你只需把生成的
kingpin_mobile_framework.xcframework文件发给顾问,对方将该文件拖入自己的项目,在「General」->「Frameworks, Libraries, and Embedded Content」中把该XCFramework的嵌入选项设为Do Not Embed,即可直接import调用,全程无法访问你的源码。
"No such module" 错误排查方案
你当前拖拽子项目编译后无法导入模块,按以下步骤逐一排查:
- 确认库目标的
Build Libraries for Distribution确实已经设置为YES,该开关未开启不会生成Swift模块接口,外部项目无法识别模块。 - 检查应用项目的构建设置中的
Framework Search Paths配置,确认已经自动添加了子项目编译输出framework的所在路径,若未添加请手动补全,同时勾选recursive选项。 - 确认库中所有需要对外暴露的类、方法、属性都添加了
public/open访问控制修饰符,Swift默认访问权限为internal,未显式声明公开的内容外部无法调用。 - 清理Xcode缓存:按
Command + Shift + K清理构建产物,删除~/Library/Developer/Xcode/DerivedData下对应项目的缓存文件夹后重新编译。 - 检查子项目的scheme是否勾选了
Shared,私有scheme不会被父项目识别,编译时不会优先构建库产物,导致模块找不到。
内容的提问来源于stack exchange,提问作者Doug Null
相关产品推荐
相关产品推荐

