ios - 如何将一个 pod 弱链接到另一个 pod?
问题描述
我有以下
- 第 3 方 xcframework (
ThirdPartyFramework
) - 封装了上述 xcframework ( ) 的私有 pod(用 Swift 编写
AdditionalSDK
) - 主要的 SDK pod,也是用 Swift (
MainSDK
)编写的 - 一个项目 (
MyProject
)
我想要实现的是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 found
了AdditionalSDKInterop.h
,但奇怪的是并非总是如此。请记住,我清理了我的项目并在每次构建之前删除了派生数据。不过,有时我会收到此错误,有时不会。我的第二个问题是Module AdditionalSDK not found
,如果我不添加pod 'AdditionalSDK'
到项目的 podfile 中,我会得到 .
我错过了什么,有什么想法吗?
解决方案
我的建议是这样的:
- 其他类中使用的任何内容
AdditionalSDK
都应通过协议使用。 - 这些协议有 2 种实现:一种带有
AdditionalSDK
,另一种作为无操作(什么都不做)。它甚至可以是您协议的默认扩展。 - 有一个工厂类,它采用您在步骤 2 中实现的类,基于一些“Swift 编译器 - 自定义标志”。
- 创建 2 个构建目标:一个用于 case with
AdditionalSDK
,一个用于 case withoutAdditionalSDK
。第一个目标将包括AdditionalSDK
Pod,以及您在步骤 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()
推荐阅读
- c++ - 使用 Eigen SVD 进行线性回归
- java - 转换列表
到地图 - python - Python 类变量列表与 int 不一致的行为
- plc - 分拣机中的产品 ID 跟踪(PLC 编程)
- c++ - 如何断开信号
- sql - 选择与依赖于过行的条件匹配的所有行
- store - 使用 $ 表示法访问 svelte store 导致引用错误
- mysql - 为什么 Power BI 重复连接到服务器?
- android - 通过电子邮件发送 Google 表格并在设备上运行相关脚本(例如带有 VBA 模块的 Excel)
- javascript - 我想使用 html 代码作为背景。我怎样才能做到这一点?