在swift中创建具有第三方依赖关系的iOS编译SDK(使用CocoaPods)

在swift中创建具有第三方依赖关系的iOS编译SDK(使用CocoaPods),ios,swift,xcode,compiled,xcframework,Ios,Swift,Xcode,Compiled,Xcframework,我在Swift 5.1中有一个SDK,我们的客户希望将其作为编译后的SDK分发(销售),而不是提供其来源 不幸的是,这个SDK依赖于一些使用CoCoapod集成的第三方库(Alamofire、RealmSwift、ReachabilitySwift等)。我知道您应该避免在您的框架/库中存在第三方依赖关系,但不幸的是,我们是在另一个机构启动该项目后才开始进行该项目的。这个SDK实际上是cocoapod的Pod,但它不是一个编译过的Pod 为了将此SDK作为编译后的SDK分发(为了避免将源文件提供给

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

不幸的是,这个SDK依赖于一些使用CoCoapod集成的第三方库(Alamofire、RealmSwift、ReachabilitySwift等)。我知道您应该避免在您的框架/库中存在第三方依赖关系,但不幸的是,我们是在另一个机构启动该项目后才开始进行该项目的。这个SDK实际上是cocoapod的Pod,但它不是一个编译过的Pod

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

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

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

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

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


谢谢!

当你说
例如,Alamofire,~>4.2.0.但我不喜欢这种方法,因为这样应用程序就不能使用更新版本的Alamofire(或其他依赖项),这只是因为编译后的sdk是使用该版本编译的。
我认为您不理解编译后的sdk的概念…当您打包sdk时,它将是静态的,因此更新第三方依赖关系的可能性无关紧要,要更新sdk,您需要向客户发布新版本,以便在必要时上载sary…客户不能自己更新SDK,一点也不能


(应该是一个注释,但太大了)

当你说
例如,Alamofire,~>4.2.0.但我不喜欢这种方法,因为这样应用程序就不能使用更新版本的Alamofire(或其他依赖项),这只是因为编译后的sdk是使用该版本编译的。
我认为您不理解编译后的sdk的概念…当您打包sdk时,它将是静态的,因此更新第三方依赖关系的可能性无关紧要,要更新sdk,您需要向客户发布新版本,以便在必要时上载sary…客户不能自己更新SDK,一点也不能


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

我知道编译SDK的概念,但我想你没有理解我的问题;)我知道谁将使用编译后的SDK,显然,不能更新/修改编译后的SDK本身以支持更新版本的第三方库,因为它是…编译的。问题是:如果你锁定第三方依赖的版本在已编译sdk的podspec中,应用程序将绑定到该版本的依赖项(或版本范围),因此,在上面的示例中,应用程序没有安装的自由,例如,在其Podfile中安装Alamofire 4.3.0。我知道编译SDK的概念,但我想你没有理解我的问题;)我知道谁将使用编译SDK,显然,不能更新/修改编译SDK本身以支持更新版本的第三方SDK问题是:如果您在已编译sdk的podspec中锁定第三方依赖项的版本,则应用程序将绑定到该依赖项的版本(或版本范围),因此,在上面的示例中,应用程序没有安装的自由,例如,在其Podfile中安装Alamofire 4.3.0。您能找到解决此问题的方法吗?不,shawn,我们只是“在podspec中将所有依赖项的版本屏蔽为特定的次要版本,我们正以这种方式分发SDK,到目前为止似乎还可以。你好,Marko,您可以将所有cocopods转换为Swift Package Manager依赖项。所有列出的库可能都有SPM版本。我就是这样解决的。你不必使用Cocopods。你能找到这个Marco的解决方案吗?不,shawn,我们“简单地”在podspec中将所有依赖项的版本屏蔽到一个特定的次要版本,并且我们以这种方式分发SDK,直到现在似乎还可以。嗨,Marko,你可以将所有Cocopods转换为Swift Package Manager依赖项。所有列出的库可能都有SPM版本。我就是这样解决的。你不必使用Cocopods。