xcframework 是什么

xcframeworkApple 引入的一种打包格式,用于在 Xcode 中分发和集成跨平台(iOS、macOS、watchOS、tvOS)库或框架。它旨在解决传统 .framework 的兼容性和维护问题。


一、xcframework 的背景和作用

1. 背景

Xcode 11 之前,开发者通常使用 .framework 格式分发静态或动态库,但 .framework 存在以下问题:

  • 架构兼容性问题: 无法同时支持模拟器和真机,因为它们使用不同的 CPU 架构(如 x86_64、arm64)。
  • 跨平台支持复杂: 如果要支持多个 Apple 平台(如 iOS、macOS、tvOS 等),通常需要多个 .framework 文件。
  • 维护困难: 开发者需要为不同架构分别编译并手动合并(使用 lipo 工具),维护成本高。

2. xcframework 的作用

  • 多架构支持: 可以在同一个 .xcframework 包中包含多个架构(如 arm64、x86_64),同时支持真机和模拟器运行。
  • 跨平台支持: 可以同时包含多个平台的二进制文件,如 iOS、macOS、watchOS 和 tvOS。
  • 简化分发: 开发者无需手动合并和维护不同架构的库,Xcode 会根据目标设备自动选择合适的二进制文件。

二、xcframework 的结构

xcframework 是一个文件夹,内部包含多个平台和架构的子框架。例如:

1
2
3
4
5
6
7
8
MyLibrary.xcframework
├── Info.plist
├── ios-arm64_armv7
│ └── MyLibrary.framework
├── ios-arm64_x86_64-simulator
│ └── MyLibrary.framework
└── macos-arm64_x86_64
└── MyLibrary.framework
  • Info.plist:描述 xcframework 的配置信息,包括支持的平台和架构。
  • ios-arm64_armv7:包含 iOS 真机所需的架构(如 arm64armv7)。
  • ios-arm64_x86_64-simulator:包含 iOS 模拟器所需的架构(如 x86_64arm64)。
  • macos-arm64_x86_64:包含 macOS 的双架构支持(如 arm64x86_64)。

三、如何创建 xcframework

1. 使用 Xcode 命令行工具

1
2
3
4
5
xcodebuild -create-xcframework \
-framework path/to/ios/MyLibrary.framework \
-framework path/to/ios-simulator/MyLibrary.framework \
-framework path/to/macos/MyLibrary.framework \
-output path/to/output/MyLibrary.xcframework
  • -create-xcframework:指定创建 xcframework
  • -framework:指定要打包的 .framework 路径。
  • -output:指定输出 .xcframework 文件的路径。

2. 示例:打包 iOS 和 iOS 模拟器框架

假设已有两个 .framework

  • iOS 真机path/to/ios/MyLibrary.frameworkarm64 架构)
  • iOS 模拟器path/to/ios-simulator/MyLibrary.frameworkx86_64arm64 架构)
1
2
3
4
xcodebuild -create-xcframework \
-framework path/to/ios/MyLibrary.framework \
-framework path/to/ios-simulator/MyLibrary.framework \
-output path/to/output/MyLibrary.xcframework

3. 在 Xcode 中集成 xcframework

  • 打开 Xcode 项目,在 “General” 标签下的 “Frameworks, Libraries, and Embedded Content” 中点击 + 添加 xcframework 文件。
  • 确保设置为 “Embed & Sign”,以便在打包时包含到 App 中。

四、xcframework 的优点

  1. 多平台支持:在一个文件中包含多个平台(iOS、macOS、watchOS、tvOS)的二进制文件。
  2. 多架构支持:支持同时包含真机和模拟器架构,解决了 .framework 无法支持多个架构的问题。
  3. 自动选择架构:Xcode 会根据目标设备和架构自动选择合适的二进制文件。
  4. 简化维护:无需手动合并和维护多个 .framework 文件,减少 lipo 操作和脚本管理。

五、对比 .framework.xcframework

比较项 .framework .xcframework
多架构支持 需要手动使用 lipo 合并 原生支持,自动选择合适架构
跨平台支持 每个平台需要单独的 .framework 文件 单一 .xcframework 支持多个平台
维护成本 高,需要手动管理架构和平台 低,Xcode 自动管理
兼容性 仅适用于某一平台 支持 iOS、macOS、watchOS、tvOS 等多平台
推荐版本 Xcode 11 及以下使用 Xcode 11 及以上推荐使用

六、注意事项

  1. Xcode 版本要求xcframeworkXcode 11 及以上版本 才被完全支持。
  2. CocoaPods 支持:CocoaPods 已支持 xcframework 的集成,但需要 podspec 文件中声明为 vendored_frameworks
  3. Carthage 支持Carthage0.38.0 开始支持 xcframework
  4. SPM 支持Swift Package Manager 原生支持 xcframework

七、总结

  • xcframework 是 Apple 推荐的框架打包格式,解决了传统 .framework 的架构兼容性和跨平台维护难题
  • 适用于需要同时支持 真机和模拟器多个 Apple 平台 的场景。
  • 推荐在 Xcode 11 及以上版本 中使用 xcframework 进行三方库或自定义库的打包和分发。