14-6.【模块化与包管理】XCFramework 支持哪些平台和架构?如何在多平台项目中集成?

29 阅读3分钟

XCFramework 的核心优势在于它是一个“多平台容器”,能够在一个包内安全地存储针对不同操作系统和指令集架构编译的二进制文件。

以下是它支持的平台、架构以及在多平台项目中的集成指南:

1. XCFramework 支持的平台与架构

XCFramework 几乎覆盖了苹果生态的所有组合。它通过物理目录隔离,解决了真机和模拟器架构同名(如 arm64)的冲突问题。

平台硬件/环境支持的架构
iOS / iPadOS真机arm64
模拟器 (Intel & Apple Silicon)x86_64, arm64
macOSIntel & Apple Siliconx86_64, arm64
Mac Catalystx86_64, arm64
watchOS真机armv7k, arm64_32
模拟器x86_64, arm64
tvOS真机arm64
模拟器x86_64, arm64
visionOS真机 & 模拟器arm64

2. 在多平台项目中集成 XCFramework

根据你的项目管理方式,主要有两种集成路径:

方案 A:通过 Swift Package Manager (SPM) 集成(推荐)

这是最现代化、最简单的方案,SPM 会自动根据当前编译目标选择正确的架构。

  1. Package.swift 中定义二进制目标

    Swift

    targets: [
        .binaryTarget(
            name: "MySharedSDK",
            path: "Binaries/MySharedSDK.xcframework" // 也可以是远程 URL
        ),
        .target(
            name: "AppLogic",
            dependencies: ["MySharedSDK"]
        )
    ]
    
  2. 自动选择:当你编译 iOS 应用时,SPM 会链接 iOS 目录下的二进制;编译 macOS 版本时,会自动切换。

方案 B:在 Xcode 工程中直接集成

如果你的项目没有使用 SPM,可以手动拖入:

  1. 添加文件:将 .xcframework 文件夹拖入 Xcode 的 Project Navigator

  2. 设置 Target:在项目的 General 选项卡中,找到 Frameworks, Libraries, and Embedded Content

  3. 配置 Embed 属性

    • 对于包含动态库的 XCFramework,选择 Embed & Sign
    • 对于纯静态库,选择 Do Not Embed
  4. 多平台处理: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)。