14-5.【模块化与包管理】Binary Framework 与 XCFramework 的区别及各自使用场景?

4 阅读3分钟

在 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),然后合并:

  1. 为真机归档

    xcodebuild archive -scheme MySDK -destination "generic/platform=iOS" ...

  2. 为模拟器归档

    xcodebuild archive -scheme MySDK -destination "generic/platform=iOS Simulator" ...

  3. 合成 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 分发的唯一标准路径。