首页 > 解决方案 > 如何将一个 pod 弱链接到另一个 pod?

问题描述

我有以下

我想要实现的是MainSDK使用来自的功能AdditionalSDK,如果AdditionalSDK存在的话。如果没有,应该在没有' 功能的MainSDK情况下继续工作。AdditionalSDK

在四处挖掘之后,我偶然发现了这个问题,这使我找到了本指南。我也尝试过其他指南,但没有任何运气。我还注意到,在最初的问题中,每个 podspec 都定义了一个供应商框架(Firebase、Facebook 和其他主要 SDK 也这样做)。在我的情况下,只有定义了AdditionalSDK一个供应商框架。定义了它的MainSDK源文件(以及头文件、模块映射等)。

正如指南所言,这#if canImport(AdditionalSDK)对我不起作用。然后我尝试实现 Obj-C 互操作性类。即我添加AdditionalSDKInterop.{h,m}如下

// AdditionalSDKInterop.h

#import <Foundation/Foundation.h>
#import <MainSDK/MainSDK-Swift.h> // <-- First problem here

@interface AdditionalSDKInterop : NSObject

@property (weak, nonatomic) id<MainSDKInteropDelegate> delegate;

+ (BOOL)isModuleAvailable;

@end
// AdditionalSDKInterop.m

#import "AdditionalSDKInterop.h"
@import AdditionalSDK; // <-- Second problem here

@implementation AdditionalSDKInterop

+ (BOOL)isModuleAvailable {
    if ([AdditionalSDK class]) {
        return YES;
    } else {
        return NO;
    }
}

@end

是 中的MainSDKInteropDelegate一个协议MainSDK,它定义了可以从 中调用的方法AdditionalSDK

@objc public protocol MainSDKInteropDelegate: class {
    @objc func initializeSDK()
}

我的第一个问题是我进入MainSDK/MainSDK-Swift.h file not foundAdditionalSDKInterop.h,但奇怪的是并非总是如此。请记住,我清理了我的项目并在每次构建之前删除了派生数据。不过,有时我会收到此错误,有时不会。我的第二个问题是Module AdditionalSDK not found,如果我不添加pod 'AdditionalSDK'到项目的 podfile 中,我会得到 .

我错过了什么,有什么想法吗?

标签: iosswiftobjective-cxcodecocoapods

解决方案


我的建议是这样的:

  1. 其他类中使用的任何内容AdditionalSDK都应通过协议使用。
  2. 这些协议有 2 种实现:一种带有AdditionalSDK,另一种作为无操作(什么都不做)。它甚至可以是您协议的默认扩展。
  3. 有一个工厂类,它采用您在步骤 2 中实现的类,基于一些“Swift 编译器 - 自定义标志”。
  4. 创建 2 个构建目标:一个用于 case with AdditionalSDK,一个用于 case without AdditionalSDK。第一个目标将包括AdditionalSDKPod,以及您在步骤 2 中创建的使用它的类。它会将标志设置为匹配“有AdditionalSDK”的值。另一个目标将包括无操作类,与标志相反。您在步骤 3 中创建的工厂类本身不会包含来自 的任何内容AdditionalSDK,因此它可以包含在两个目标中。

大致是这样的:

// Member of both targets. Your classes only use this protocol
protocol MyOptionalSDKProxy {
   func something()
   ...
}

// Member of both targets
extension MyOptionalSDKProxy {
   func something() { /* no-op*/ }
}

// Member of target with AdditionalSDK
import AdditionalSDK //<-- only here import Additional SDK
class MyProxyWithAdditionalSDK: MyOptionalSDKProxy {
   func something() { print("hello from AdditionalSDK") }
}

// Member of target with no AdditionalSDK
class MyNoOpProxy: MyOptionalSDKProxy {}

// Member of both targets
class MyProxyFactory {
    static var proxy: MyOptionalSDKProxy {
        #if USEADDITIONALSDK // <-- a flag defined for target with AdditionalSDK
           return MyProxyWithAdditionalSDK()
        #else
           return MyNoOpProxy()
        #endif
    }
}

// Usage
let myProxy = MyProxyFactory.proxy
proxy.something()

推荐阅读