在 Swift 生态中,理解这两者的区别对于 SDK 开发和项目构建至关重要。简单来说,Binary Framework 是一个通用的概念,而 XCFramework 是苹果目前官方推荐的、实现该概念的具体格式。
1. 概念界定
Binary Framework (二进制库)
这是一个广义术语,指代任何已经编译成机器码、不含源代码的库。在 iOS 历史上,它经历过几个阶段:
- 静态库 (.a) :纯二进制,不含资源,需配合
.h头文件使用。 - 传统 Framework (.framework) :将二进制、头文件和资源(如图片)打包在一起。但它通常是单架构的(例如只支持真机或只支持模拟器)。
XCFramework (.xcframework)
这是苹果在 Xcode 11 中引入的一种新型分发格式,专门用于取代复杂的“胖二进制”(Fat Binaries/Lipo)。
- 多架构容器:它实际上是一个文件夹,内部包含针对不同平台(iOS, macOS, watchOS)和不同架构(arm64 真机, x86_64 模拟器)的多个独立
.framework。 - 原生支持:它是 SPM (Swift Package Manager) 唯一原生支持的二进制分发格式。
2. 核心区别对比
| 特性 | 传统 Binary Framework (Fat Binary) | XCFramework |
|---|---|---|
| 多架构实现 | 使用 lipo 工具将不同架构强行合并为一个文件。 | 内部结构化存储,针对不同平台有独立目录。 |
| 模拟器冲突 | 无法同时包含 arm64 真机和 M1/M2 模拟器(架构同名冲突)。 | 完美支持。真机和模拟器架构物理隔离。 |
| Swift 模块支持 | 依赖 .swiftinterface。 | 内置 .swiftinterface,支持模块稳定性。 |
| 分发便捷性 | 开发者常需手动剔除模拟器架构才能上架 App Store。 | 无需手动处理。Xcode 自动根据目标选择对应架构。 |
| 工具链依赖 | 往往需要复杂的脚本维护。 | 苹果官方工具链 xcodebuild -create-xcframework 支持。 |
3. 使用场景建议
选择 XCFramework 的场景(首选方案)
- 开发闭源 SDK:如果你要将公司内部的代码提供给外部集成,XCFramework 是标准做法。
- 通过 SPM 分发:SPM 不支持直接分发
.framework,必须包装成.xcframework。 - 跨平台分发:如果你的库同时支持 iOS、iPadOS 和 macOS(尤其是 Apple Silicon Mac)。
- 优化构建速度:将大型、不常改动的底层模块(如自研图像处理库)编译为 XCFramework,可以显著减少项目编译时间。
使用传统 Binary Framework 的场景
- 老旧项目维护:某些还在使用 Xcode 10 甚至更早版本的远古项目。
- 内部临时链接:仅在本地开发环境中,快速将一个 Target 链接到另一个 Target,且不涉及跨平台或模拟器架构冲突。
4. 如何将代码转换为 XCFramework?
要构建一个真正的 XCFramework,你需要先为不同平台生成归档(Archives),然后合并:
-
为真机归档:
xcodebuild archive -scheme MySDK -destination "generic/platform=iOS" ... -
为模拟器归档:
xcodebuild archive -scheme MySDK -destination "generic/platform=iOS Simulator" ... -
合成 XCFramework:
Bash
xcodebuild -create-xcframework \ -framework ios_devices.archive/Products/Library/Frameworks/MySDK.framework \ -framework ios_simulators.archive/Products/Library/Frameworks/MySDK.framework \ -output MySDK.xcframework
总结
XCFramework 是 Binary Framework 的进化版。它解决了 M1 芯片时代模拟器与真机架构命名的尴尬冲突,是目前模块化和 SDK 分发的唯一标准路径。