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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:35:20