静态库iOS中的弱链接

静态库iOS中的弱链接,ios,objective-c,xcode,frameworks,weak-linking,Ios,Objective C,Xcode,Frameworks,Weak Linking,我们已经构建了一个静态框架,它依赖于我们用来访问ID的SDK。这个SDK已经推出了一个新版本,它有一个新的接口 目前,用户将添加我们的框架和依赖SDK,一切正常。现在,我们希望用户能够添加我们的框架和旧的或新的SDK,我不知道如何在不创建多个目标的情况下做到这一点,我们不希望这样做。按照我的设置方式,用户必须添加我们的SDK以及新旧SDK 我有一个协议SDKProtocol,它由两个类NewSDKServices和OldSDKServices实现 NewSDKServices只有在新SDK存在时

我们已经构建了一个静态框架,它依赖于我们用来访问ID的SDK。这个SDK已经推出了一个新版本,它有一个新的接口

目前,用户将添加我们的框架和依赖SDK,一切正常。现在,我们希望用户能够添加我们的框架和旧的或新的SDK,我不知道如何在不创建多个目标的情况下做到这一点,我们不希望这样做。按照我的设置方式,用户必须添加我们的SDK以及新旧SDK

我有一个协议
SDKProtocol
,它由两个类
NewSDKServices
OldSDKServices
实现

NewSDKServices
只有在新SDK存在时才会编译,而
OldSDKServices
只有在旧SDK存在时才会编译。我认为这是可以的,因为它是一个预编译的框架,我们可以在运行时决定使用哪个框架

然后我希望能够执行类似的操作,可以使用
ifdef
导入并初始化正确的服务

if (useNewSDK) {
    _sdkService = [[NewSDKServices alloc] init];
} else {
    _sdkService = [[OldSDKServices alloc] init];
}
我曾经考虑过弱链接这些库,但不确定它将如何工作,因为不能将静态框架链接到其他静态框架。我希望有个方向


两个SDK都有一些标题和一个
.a

我知道你说过你不想要两个目标。 老实说,这可能是最好的选择,因为您在需求方面是明确的、坦率的,所以没有人会轻易混淆。 有许多方法可以通过重复使用源文件甚至按照您建议的方式来管理此问题

if (useNewSDK) {
    _sdkService = [[NewSDKServices alloc] init];
} else {
    _sdkService = [[OldSDKServices alloc] init];
}
会是

#ifdef USE_SDK_NEW
    _sdkService = [[LinkedSDK alloc] init];
#else //USE_SDK_NEW
    _sdkService = [[LinkedSDK alloc] init];
#endif //USE_SDK_NEW 
然而。。。如果你真的想用另一种方式去做,并且成功了,你必须尝试使用弱链接

如果使用弱链接,通常需要NSClassFromString(…)来访问内容。您需要确定SDK的可用性,希望有人已经将信息添加到静态类中,如
[NSClassFromString(“TheSdk”)performSelector:@“GetVersion”]
,或者使用其他类存在或不存在的知识。如果两个版本之间的类集相同,则可以回退到查询选择器或成员

同样,这也不太好。如果您熟悉旧SDK和新SDK的策略,可以通过使用strategy模式使其不那么难看,并尝试弱链接这些类,而不会导致编译器需要它们


如果您将自己作为pod分发,您可以创建两个目标,并使用该版本来区分所需的其他SDK。

您是将库作为二进制还是源代码分发?@MitchellCurrie作为二进制。因此,您会将您的框架弱链接到其他公司SDK框架,对吗?只是查询一下,这是一个实际的框架还是一个拖放的.a+.h文件?@MitchellCurrie用户所做的是添加我们的
.a
,并通过.a+.h添加其他SDK。它们不是弱链接我们的框架,我们本质上是一个可选插件,依赖于“更大的”父sdk。我们正在引用它们,我们希望能够引用SDK的任何一个版本。感谢您的回答!如果您熟悉旧SDK和新SDK,并且有相应的策略,您能否详细说明
,并尝试弱链接这些类,而不会导致编译器需要它们。
?调用一些getter时,我们与SDK的交互非常有限。我将使用文件newSDK.m和oldSDK.m进行调用。这样,每个文件都可以包含不同版本的标题。.h文件不应引用SDK,以便实用程序的入口点可以安全地引用它,而不管版本如何。一旦你确定了你调用的版本,
[OldSDK-work]
或者
[NewSDK-work]
嗯。我觉得这就是我所拥有的。我为旧sdk实现了一个协议,为新sdk实现了一个协议。我也有一些文件,我只想为新的SDK。也许多个目标是最好的路线,但我希望不是。多个目标实际上可以简化事情。您可以添加新目标并共享文件。在某些情况下,目标可以是相同的,您可以创建单独的方案来注入不同的构建变量。由于您正在更改链接,因此使用目标和共享公共逻辑可能会更容易。一般来说,如果支持新旧框架并不重要,我将放弃对旧框架的支持。另一方面,如果新旧SDK之间的协议不同,您可以创建适配器来抽象调用。这两个目标可以拥有所有相同的源文件,但adapter.h是共享的,adapter.m的包含方式根据目标的不同而有所不同,因此所需目标的编译功能不同(这本身就是一种策略模式)