You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建含SPM第三方依赖的Swift xcFramework?

自定义xcFramework(FrameworkA)依赖SPM第三方框架(FrameworkB)的可行实现方案

首先明确:Apple严格禁止嵌套框架(把FrameworkB打包进FrameworkA的xcFramework内部),所以必须采用拆分依赖或声明依赖的方式处理,以下是几个经过验证的可行方案:

方案1:独立交付两个xcFramework,让客户手动集成

  1. 先单独打包FrameworkB为xcFramework:
    • 把FrameworkB通过SPM拉取到单独项目,或直接用xcodebuild从SPM地址归档:
      xcodebuild archive -scheme FrameworkB -destination "generic/platform=iOS" -archivePath "./FrameworkB-iOS.xcarchive" SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
      xcodebuild archive -scheme FrameworkB -destination "generic/platform=iOS Simulator" -archivePath "./FrameworkB-Sim.xcarchive" SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
      xcodebuild -create-xcframework -framework ./FrameworkB-iOS.xcarchive/Products/Library/Frameworks/FrameworkB.framework -framework ./FrameworkB-Sim.xcarchive/Products/Library/Frameworks/FrameworkB.framework -output ./FrameworkB.xcframework
      
  2. 将FrameworkB.xcframework加入FrameworkA项目,在FrameworkA的Target的Frameworks and Libraries中设置为Do Not Embed
  3. 用你之前的xcodebuild archive流程正常打包FrameworkA的xcFramework,此时FrameworkA不会包含FrameworkB的内容
  4. 交付时同时提供两个xcFramework,并告知客户:
    • 将两个框架都加入项目
    • FrameworkA的依赖设置为FrameworkB,且FrameworkB需设置为Embed & Sign(可根据客户项目需求调整)

方案2:通过SPM声明依赖,让客户自动拉取FrameworkB

如果你的FrameworkA支持SPM分发,这是最省心的方式:

  1. 在FrameworkA的Package.swift中添加FrameworkB的依赖声明:
    dependencies: [
        .package(url: "https://github.com/xxx/FrameworkB.git", from: "1.0.0")
    ],
    targets: [
        .target(
            name: "FrameworkA",
            dependencies: [.product(name: "FrameworkB", package: "FrameworkB")]
        )
    ]
    
  2. 打包FrameworkA的xcFramework时,无需包含任何FrameworkB的内容
  3. 交付方式:
    • 把FrameworkA发布到私有SPM仓库,客户通过SPM集成时,SPM会自动拉取FrameworkB
    • 或给客户提供FrameworkA的xcFramework和对应的Package.swift模板,让客户本地集成

方案3:静态链接FrameworkB到FrameworkA(需注意许可)

如果FrameworkB的许可协议允许静态链接(需确认版权条款),可以将FrameworkB的代码直接合并到FrameworkA的二进制中:

  1. 确认FrameworkB支持静态链接:若为SPM包,其Package.swift中的products需为.library(name: "FrameworkB", type: .static)
  2. 在FrameworkA的Target设置中:
    • 进入Build Phases -> Link Binary With Libraries,将FrameworkB的链接类型改为静态
    • 在Frameworks and Libraries中设置为Do Not Embed(静态链接内容会直接合并到FrameworkA中)
  3. 正常打包FrameworkA的xcFramework,交付时仅需提供FrameworkA.xcframework即可
  4. 重点提醒:必须确保FrameworkB的许可协议允许你将其代码静态链接后分发,避免版权纠纷

内容的提问来源于stack exchange,提问作者Z S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:03:22