0

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

目前,用户将添加我们的框架和依赖 SDK,一切都会正常工作。现在我们希望用户能够添加我们的框架以及旧的或新的 SDK,我不确定如何在不创建多个目标的情况下做到这一点,而我们不想这样做。通过我设置它的方式,用户必须添加我们的 SDK 以及新旧 SDK。

我有一个SDKProtocol由两个类NewSDKServicesOldSDKServices.

NewSDKServices除非存在新 SDK,OldSDKServices否则不会编译,除非存在旧 SDK,否则不会编译。我认为这没关系,因为它是一个预编译的框架,我们可以在运行时决定使用哪个。

然后我希望能够做这样的事情,也许ifdef可以导入和初始化正确的服务。

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

我考虑过弱链接这些库,但不确定它是如何工作的,因为你不能将框架静态链接到其他静态框架。我希望有一个方向。

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

4

1 回答 1

1

我知道你说过你不想要两个目标。老实说,这可能是最好的选择,因为您要明确和预先了解需求,因此没有人可以轻易混淆。有很多方法可以通过重新使用源文件甚至按照您建议的方式来管理它

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 有策略,则可以使用策略模式使其不那么难看,并尝试弱链接类而不导致编译器需要它们。

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

于 2018-06-28T02:10:20.620 回答