如何创建含SPM第三方依赖的Swift xcFramework?
自定义xcFramework(FrameworkA)依赖SPM第三方框架(FrameworkB)的可行实现方案
首先明确:Apple严格禁止嵌套框架(把FrameworkB打包进FrameworkA的xcFramework内部),所以必须采用拆分依赖或声明依赖的方式处理,以下是几个经过验证的可行方案:
方案1:独立交付两个xcFramework,让客户手动集成
- 先单独打包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
- 把FrameworkB通过SPM拉取到单独项目,或直接用
- 将FrameworkB.xcframework加入FrameworkA项目,在FrameworkA的Target的
Frameworks and Libraries中设置为Do Not Embed - 用你之前的
xcodebuild archive流程正常打包FrameworkA的xcFramework,此时FrameworkA不会包含FrameworkB的内容 - 交付时同时提供两个xcFramework,并告知客户:
- 将两个框架都加入项目
- FrameworkA的依赖设置为FrameworkB,且FrameworkB需设置为Embed & Sign(可根据客户项目需求调整)
方案2:通过SPM声明依赖,让客户自动拉取FrameworkB
如果你的FrameworkA支持SPM分发,这是最省心的方式:
- 在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")] ) ] - 打包FrameworkA的xcFramework时,无需包含任何FrameworkB的内容
- 交付方式:
- 把FrameworkA发布到私有SPM仓库,客户通过SPM集成时,SPM会自动拉取FrameworkB
- 或给客户提供FrameworkA的xcFramework和对应的
Package.swift模板,让客户本地集成
方案3:静态链接FrameworkB到FrameworkA(需注意许可)
如果FrameworkB的许可协议允许静态链接(需确认版权条款),可以将FrameworkB的代码直接合并到FrameworkA的二进制中:
- 确认FrameworkB支持静态链接:若为SPM包,其
Package.swift中的products需为.library(name: "FrameworkB", type: .static) - 在FrameworkA的Target设置中:
- 进入
Build Phases->Link Binary With Libraries,将FrameworkB的链接类型改为静态 - 在
Frameworks and Libraries中设置为Do Not Embed(静态链接内容会直接合并到FrameworkA中)
- 进入
- 正常打包FrameworkA的xcFramework,交付时仅需提供FrameworkA.xcframework即可
- 重点提醒:必须确保FrameworkB的许可协议允许你将其代码静态链接后分发,避免版权纠纷
内容的提问来源于stack exchange,提问作者Z S
相关产品推荐
相关产品推荐

