使用Swift Package构建可交付iOS闭源静态库的方案咨询
报错原因说明
你遇到的No such module错误主要有两个常见原因:
- 仅将
.a静态库文件引入项目,没有将编译生成的.swiftmodule、.swiftinterface等模块描述文件所在路径添加到项目的SWIFT_INCLUDE_PATHS搜索路径中,Xcode无法识别该二进制对应的Swift模块 - 库中的公共类、方法未标记
public/open权限,外部项目无法访问
符合要求的静态库构建方案
核心要求适配说明
- 闭源要求:仅交付编译后的二进制产物和公开接口描述文件,不提供源码即可满足客户无法查看源代码的要求
- 兼容性要求:需要分别构建iOS真机(arm64)、iOS模拟器(arm64/x86_64)两个平台的产物,苹果官方推荐使用XCFramework格式打包多平台产物,避免传统universal库无法合并同架构不同平台二进制的问题
推荐方案:使用XCFramework打包(无需手动lipo合并)
这是目前最稳定的交付方案,操作步骤如下:
- 先在
Package.swift中配置最低支持版本为iOS14:
// Package.swift 头部配置 let package = Package( name: "myLibNameHere", platforms: [ .iOS(.v14) ], products: [ .library(name: "myLibNameHere", type: .static, targets: ["myLibNameHere"]), ], // 其余配置保持不变 )
- 分别执行归档命令生成真机和模拟器的归档包,注意开启
BUILD_LIBRARY_FOR_DISTRIBUTION保证Swift版本兼容性:
# 归档真机版本 xcodebuild archive \ -scheme myLibNameHere \ -destination "generic/platform=iOS" \ -archivePath ./iOS \ SKIP_INSTALL=NO \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES # 归档模拟器版本 xcodebuild archive \ -scheme myLibNameHere \ -destination "generic/platform=iOS Simulator" \ -archivePath ./iOSSimulator \ SKIP_INSTALL=NO \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES
- 将两个归档包打包为XCFramework:
xcodebuild -create-xcframework \ -archive ./iOS.xcarchive Products/Library/libmyLibNameHere.a \ -archive ./iOSSimulator.xcarchive Products/Library/libmyLibNameHere.a \ -output ./myLibNameHere.xcframework
生成的myLibNameHere.xcframework可以直接交付给客户,拖入iOS项目即可自动匹配对应平台的二进制,无需额外配置。
常见问题解答
是否需要单独编译模拟器版本再用lipo合并?
如果使用传统universal静态库格式,你确实需要单独编译真机和模拟器版本,但有两个限制:
- 真机arm64架构和M系列Mac模拟器的arm64架构属于不同平台,无法通过lipo合并,强行合并会导致架构冲突
- 你需要给客户分别提供真机和模拟器两个版本的静态库,集成时需要额外配置构建设置
Swift Package Manager 5.3+已经支持更简便的同平台多架构构建方式,你可以通过传入多个--arch参数一次编译出同平台下的多架构二进制,无需单独编译后再用lipo合并,示例命令如下:
# 一次编译出同时支持arm64和x86_64架构的模拟器版本 swift build -c release \ --arch arm64 \ --arch x86_64 \ -Xswiftc "-sdk" \ -Xswiftc "`xcrun --sdk iphonesimulator --show-sdk-path`" \ -Xswiftc "-target" \ -Xswiftc "arm64-apple-ios14.0-simulator"
交付注意事项
- 所有对外暴露的类、方法、属性必须标记为
public/open权限,否则外部项目无法访问 - 必须开启
BUILD_LIBRARY_FOR_DISTRIBUTION配置,否则你的库只能在与你编译时相同的Swift版本下使用,客户升级Xcode后会出现兼容性问题 - 交付时仅需提供XCFramework文件,不需要提供任何源码
内容的提问来源于stack exchange,提问作者badadin
相关产品推荐
相关产品推荐

