首页 > 解决方案 > 快速创建具有第三方依赖项的 iOS 编译 SDK(使用 CocoaPods)

问题描述

我在Swift 5.1中有一个 SDK,我们的客户希望将其作为已编译的 SDK 分发(出售)而不是提供其源代码。

不幸的是,这个 SDK 依赖于一些第三方库,使用 CocoaPods(Alamofire、RealmSwift、ReachabilitySwift 等)集成。我知道您应该避免在您的框架/库中包含第三方依赖项,但不幸的是,我们在另一个机构启动后开始着手这个项目。这个SDK其实是cocoapod的Pod,但不是编译好的pod。

将此 SDK 作为编译后的 SDK 分发的最佳方法是什么(以避免将源文件提供给最终购买它的消费者)?

据我了解,如果您使用第三方依赖项编译您的 sdk,您必须确保应用程序将使用与编译后的 sdk 使用的具有相同公共 api 的相同库,否则应用程序将崩溃运行。据我所知,这样做的唯一方法是在编译的 sdk podspec 中指定每个第三方依赖项的非常严格的版本。例如,Alamofire,'~> 4.2.0'。但我不喜欢这种方法,因为这样应用程序不能使用更新版本的 Alamofire(或其他依赖项),只是因为已编译的 sdk 已使用该版本编译。

我正在创建一个 XCFramework,然后是一个 podspec,其中 XCFramework 作为 vendored_framework 出售(使用 CocoaPods 1.9.0-beta2,这是目前唯一支持 XCFrameworks 作为 vendored_framework 的)。

我尝试了许多不同的方法,例如尝试将编译的 sdk 构建为静态库并将其第三方依赖项也链接为静态库,但在这种情况下,当在应用程序中使用它时,以及相同的依赖项(例如 Alamofire),我看到在控制台中,一些“X 类在 Y 和 Z 中都实现。使用哪一个是未定义的”(其中 Y 和 Z 是 sdk 和应用程序)。

你有什么建议吗?你会怎么做?

谢谢!

标签: iosswiftxcodecompiledxcframework

解决方案


当你说For example, Alamofire, '~> 4.2.0'. But I don't like this approach because this way the app can't use a newer version of Alamofire (or the other dependencies), only because the compiled sdk has been compiled with that version.我不认为你理解编译SDK的概念时......当你打包SDK时它将是静态的,所以更新第三方依赖的可能性并不重要,更新你需要的SDK向客户发布新版本,以便您在需要时上传...客户无法自行更新SDK,完全没有。

(应该是评论,但太大了)


推荐阅读