Mic*_*tin 8 cocoapods firebase swift swift-package-manager google-mlkit
概述
我有两个依赖项,一个作为 Swift 包提供,另一个仅作为 Cocoapod 提供。问题是每个版本都依赖于第三个包,这会导致存在多个版本时出现未定义的行为。
在基本层面上,这是我的依赖项的图形
APP imports:
B (SPM) imports:
C (SPM) imports:
D (SPM) <-
E (Pod) imports:
D (Pod) <-
Run Code Online (Sandbox Code Playgroud)
我想删除该版本并通过 Podfile 脚本或构建脚本D (Pod)指向该版本。D (SPM)
更具体的信息:
我有一个导入的 NetworkingService Swift 包Firebase,我的主应用程序导入 NetworkingService。我的 Podfile 导入GoogleMLKit/PoseDetection. Firebase 和 PoseDetection 共享依赖项,当存在重复项时,这些依赖项会导致未定义的行为(运行时崩溃)。
注意:通过删除中间 NetworkingService 包并将 Firebase 作为 Swift 包导入主应用程序,应该可以重现此错误。
Podfile
platform :ios, '15.0'
target 'MyApp' do
use_frameworks!
pod 'GoogleMLKit/PoseDetection', '2.5.0'
end
Run Code Online (Sandbox Code Playgroud)
在 Package.swift 中
.package(
name: "Firebase",
url: "https://github.com/firebase/firebase-ios-sdk.git",
.upToNextMajor(from: "8.10.0")
),
Run Code Online (Sandbox Code Playgroud)
它们复制了一些依赖项,包括GoogleUtilities和FBLPromises。崩溃后启动应用程序pod install并出现运行时异常:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[FBLPromise HTTPBody]: unrecognized selector sent to instance 0x6000017685d0'
Run Code Online (Sandbox Code Playgroud)
通过搜索,我找到了这个GitHub 问题,其中一位贡献者提到:
重复的警告表明存在不确定性行为。当一个库有多个副本时,可能会也可能不会选择正确的一个。
然后,我尝试使用我在另一个 StackOverflow 帖子上找到的链接的脚本的修改版本来重构所有 Cocoapod 依赖项。尝试使 PoseDetection 显式指向GoogleUtilitiesCopy和中的符号FBLPromisesCopy。但似乎即使这些副本的存在,尽管指向相应的依赖关系,也会产生未定义的行为。
部分解决方法
如果我pod install跟着跑File > Packages > Update to latest package versions。该应用程序将启动,而不会立即运行时崩溃。但是,我稍后在应用程序中遇到其他运行时崩溃。***
理想的解决方案
我想删除重复的 pod 依赖项,并通过 Podfile 或构建阶段脚本指向 SPM 版本,但我不确定从哪里开始。
Firebase 可以作为 pod 导入,但我不想这样做,因为我有一个依赖于 Firebase 的现有 SPM 基础设施。我不想将所有这些包转换为 Pod。
SPM和Cocapods的主要问题是:SPM不知道Cocapods,而Cocapods不知道SPM。
我也遇到过类似的情况:
我认为有两个解决方案值得尝试。
1.) 删除 pod 并尝试使用它的 XCFramework 版本(应该可用)。这意味着您应该手动将库添加到您的项目中,并且应根据需要选择它作为嵌入和签名。
2.) 您可以使用简单的二进制目标将 pod 库转换为 SPM。基本上,您需要创建一个指向 XCFramework 存档版本的包文件(因此它应该是一个 zip 文件)。这样 SPM 图将自行处理。
我知道这并不理想,但这两种方法对我有用。
| 归档时间: |
|
| 查看次数: |
5205 次 |
| 最近记录: |