ios - 静态库 iOS 中的弱链接

标签 ios objective-c xcode frameworks weak-linking

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

目前,用户将添加我们的框架和依赖 SDK,一切正常。现在我们希望用户能够添加我们的框架以及旧的或新的 SDK,但我不确定如何在不创建多个目标的情况下执行此操作,而我们不想这样做。按照我设置的方式,用户必须添加我们的 SDK 以及新旧 SDK。

我有一个协议(protocol)SDKProtocol,它由两个类NewSDKServicesOldSDKServices实现。

除非存在新 SDK,否则

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

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

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

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

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

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

关于ios - 静态库 iOS 中的弱链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51073077/

相关文章:

objective-c - 将 NSValue 转换回 CGPoint

ios - 如何通过通讯录获取用户

ios - UIView.animateWithDuration 越界

ios - 包含来自本地 JSON 文件的部分的 UITableView

ios - Firebase InAppMessaging 导致我的项目崩溃,错误代码为 "-[NSBundle initWithURL:]: nil URL argument"

ios - 关于 iOS 应用程序的图像和图标名称以及图标大小的最终说明

ios - 转换标签栏 Controller 的导航 Controller 的可见 View Controller

ios - Facebook 全屏图片

ios - 在 iOS 中找不到位置并自动关闭警报

ios sdk 停止多点触控功能