Swift动态框架生成XCFramework时处理可选依赖与多版本构建方案咨询
实现两种XCFramework版本的可行方案
1. 多Target分版本构建
在ProductSDK的Xcode项目中创建两个Target(比如ProductSDK-Basic和ProductSDK-Full),分别对应两种依赖场景:
- ProductSDK-Basic:仅链接
CommonDependencySDK,无需引入AdvanceDependencySDK - ProductSDK-Full:同时链接
CommonDependencySDK和AdvanceDependencySDK
针对每个Target配置独立的编译宏(比如Basic版本定义ONLY_COMMON_DEPENDENCY,Full版本定义INCLUDE_ADVANCE_DEPENDENCY),然后分别执行打包命令生成XCFramework:
# 构建Basic版本(仅依赖Common) xcodebuild archive -scheme ProductSDK-Basic -destination "generic/platform=iOS" -archivePath ./Build/Basic-iOS.xcarchive SKIP_INSTALL=NO xcodebuild archive -scheme ProductSDK-Basic -destination "generic/platform=iOS Simulator" -archivePath ./Build/Basic-iOSSim.xcarchive SKIP_INSTALL=NO xcodebuild -create-xcframework -framework ./Build/Basic-iOS.xcarchive/Products/Library/Frameworks/ProductSDK.framework -framework ./Build/Basic-iOSSim.xcarchive/Products/Library/Frameworks/ProductSDK.framework -output ./ProductSDK-Basic.xcframework # 构建Full版本(依赖两个SDK) xcodebuild archive -scheme ProductSDK-Full -destination "generic/platform=iOS" -archivePath ./Build/Full-iOS.xcarchive SKIP_INSTALL=NO xcodebuild archive -scheme ProductSDK-Full -destination "generic/platform=iOS Simulator" -archivePath ./Build/Full-iOSSim.xcarchive SKIP_INSTALL=NO xcodebuild -create-xcframework -framework ./Build/Full-iOS.xcarchive/Products/Library/Frameworks/ProductSDK.framework -framework ./Build/Full-iOSSim.xcarchive/Products/Library/Frameworks/ProductSDK.framework -output ./ProductSDK-Full.xcframework
2. 单Target+脚本参数控制
保持单个Target,将AdvanceDependencySDK设置为可选依赖(在Xcode的Link Binary With Libraries中标记为Optional),然后通过编译参数控制是否启用进阶功能:
- 编译时通过
GCC_PREPROCESSOR_DEFINITIONS传递宏参数,区分版本 - 分别打包两种配置的XCFramework:
# 编译Basic版本 xcodebuild archive -scheme ProductSDK -destination "generic/platform=iOS" -archivePath ./Build/Basic-iOS.xcarchive SKIP_INSTALL=NO GCC_PREPROCESSOR_DEFINITIONS="ONLY_COMMON=1" # 编译Full版本 xcodebuild archive -scheme ProductSDK -destination "generic/platform=iOS" -archivePath ./Build/Full-iOS.xcarchive SKIP_INSTALL=NO GCC_PREPROCESSOR_DEFINITIONS="INCLUDE_ADVANCE=1"
替代宏的可选依赖处理方式
1. 协议抽象+依赖注入
把AdvanceDependencySDK的功能抽象成协议,ProductSDK仅依赖协议而非具体SDK,由集成方按需注入实现:
// ProductSDK内部定义协议 public protocol AdvanceFeatureProtocol { func performAdvanceOperation() } public class ProductSDK { private let advanceFeature: AdvanceFeatureProtocol? // 仅用Common的初始化 public init(commonDependency: CommonDependency) { self.advanceFeature = nil } // 同时用Common+Advance的初始化 public init(commonDependency: CommonDependency, advanceFeature: AdvanceFeatureProtocol) { self.advanceFeature = advanceFeature } public func execute() { // 基础逻辑(依赖Common) commonDependency.doBasicThing() // 进阶逻辑(依赖注入的实现) advanceFeature?.performAdvanceOperation() } } // 集成方如果用AdvanceSDK,只需实现协议 import AdvanceDependencySDK class AdvanceFeatureAdapter: AdvanceFeatureProtocol { func performAdvanceOperation() { AdvanceSDK.shared.runAdvanceTask() } }
2. 模块化拆分
将ProductSDK拆分为两个独立模块:
- ProductSDK-Core:仅依赖
CommonDependencySDK,提供基础功能 - ProductSDK-Advance:依赖
ProductSDK-Core和AdvanceDependencySDK,提供进阶扩展功能
集成方可以按需选择:只集成Core用基础功能,同时集成Core+Advance用完整功能。
3. 动态库运行时加载(iOS 12+)
通过dlopen动态检测并加载AdvanceDependencySDK,无需编译时依赖:
import CommonDependencySDK public class ProductSDK { private var advanceLibHandle: UnsafeMutableRawPointer? public init() { // 尝试加载Advance动态库 advanceLibHandle = dlopen("/Library/Frameworks/AdvanceDependencySDK.framework/AdvanceDependencySDK", RTLD_LAZY) } public func triggerAdvanceAction() { guard let handle = advanceLibHandle else { // 无AdvanceSDK时的降级逻辑 return } // 获取并调用SDK中的方法 let funcPtr = dlsym(handle, "performAdvanceOperation") typealias AdvanceFunc = @convention(c) () -> Void let advanceOperation = unsafeBitCast(funcPtr, to: AdvanceFunc.self) advanceOperation() } }
内容的提问来源于stack exchange,提问作者S Surya
相关产品推荐
相关产品推荐

