XCFramework 的核心优势在于它是一个“多平台容器”,能够在一个包内安全地存储针对不同操作系统和指令集架构编译的二进制文件。
以下是它支持的平台、架构以及在多平台项目中的集成指南:
1. XCFramework 支持的平台与架构
XCFramework 几乎覆盖了苹果生态的所有组合。它通过物理目录隔离,解决了真机和模拟器架构同名(如 arm64)的冲突问题。
| 平台 | 硬件/环境 | 支持的架构 |
|---|---|---|
| iOS / iPadOS | 真机 | arm64 |
| 模拟器 (Intel & Apple Silicon) | x86_64, arm64 | |
| macOS | Intel & Apple Silicon | x86_64, arm64 |
| Mac Catalyst | x86_64, arm64 | |
| watchOS | 真机 | armv7k, arm64_32 |
| 模拟器 | x86_64, arm64 | |
| tvOS | 真机 | arm64 |
| 模拟器 | x86_64, arm64 | |
| visionOS | 真机 & 模拟器 | arm64 |
2. 在多平台项目中集成 XCFramework
根据你的项目管理方式,主要有两种集成路径:
方案 A:通过 Swift Package Manager (SPM) 集成(推荐)
这是最现代化、最简单的方案,SPM 会自动根据当前编译目标选择正确的架构。
-
在
Package.swift中定义二进制目标:Swift
targets: [ .binaryTarget( name: "MySharedSDK", path: "Binaries/MySharedSDK.xcframework" // 也可以是远程 URL ), .target( name: "AppLogic", dependencies: ["MySharedSDK"] ) ] -
自动选择:当你编译 iOS 应用时,SPM 会链接 iOS 目录下的二进制;编译 macOS 版本时,会自动切换。
方案 B:在 Xcode 工程中直接集成
如果你的项目没有使用 SPM,可以手动拖入:
-
添加文件:将
.xcframework文件夹拖入 Xcode 的 Project Navigator。 -
设置 Target:在项目的 General 选项卡中,找到 Frameworks, Libraries, and Embedded Content。
-
配置 Embed 属性:
- 对于包含动态库的 XCFramework,选择 Embed & Sign。
- 对于纯静态库,选择 Do Not Embed。
-
多平台处理:Xcode 会识别出该包包含多平台支持,你不需要像以前那样为不同平台创建不同的 Target 依赖。
3. 多平台集成的进阶策略
A. 处理平台差异代码
即使底层二进制支持多平台,你的业务代码可能需要区分处理。利用 Swift 的条件编译:
Swift
#if os(iOS)
import MySharedSDK // iOS 特有逻辑
#elseif os(macOS)
import MySharedSDK // macOS 特有逻辑
#endif
B. 检查 XCFramework 包含的架构
在集成前,你可以通过终端命令核实该包是否真的支持你需要的平台:
Bash
file MySharedSDK.xcframework/ios-arm64/MySharedSDK.framework/MySharedSDK
# 或者查看整体结构
ls -R MySharedSDK.xcframework
C. 解决 App Store 上架问题
传统的“胖二进制(Fat Binary)”在提交 App Store 前需要脚本剔除模拟器架构。而 XCFramework 不需要,Xcode 会在打包(Archive)阶段自动提取当前目标平台所需的二进制,过滤掉其他无用架构,减小包体积。
总结建议
- 对于 SDK 提供者:务必在构建时包含
arm64模拟器架构,以支持 M1/M2 芯片的 Mac 开发者。 - 对于集成者:优先使用 SPM 链接 XCFramework,它可以极大简化多平台配置的复杂度,并自动处理搜索路径(Header Search Paths)。