oak*_*ker 5 xcode ios cocoapods firebase swift
这是针对 Firebase 6.26.0 和 6.27.0(我都尝试过,原因将变得清晰)
我有一个 Swift 应用程序,我试图将其从当前的整体分解为模块,但到目前为止,我还无法通过在每个单独的模块中安装 Firebase pod 来跨模块(即框架)公开 Firebase 类。它仅在只有一个现有库并且该库安装在应用程序目标中并在 AppDelegate 中实例化时才有效。
有谁知道是否可以在单个工作区中跨多个模块实施 Firebase?
预期成绩
Firebase 类将向多模块 Swift 应用程序中的所有模块公开,其中存在一个或多个 Firebase 库副本,允许所有模块调用 Firebase 方法并在 FirebaseApp 的单个全局实例中实现 Firebase 类。
实际结果
Firebase 要么因为工作区中存在多个 Firebase 库而拒绝实例化,要么当只存在一个库时,Firebase 类无法向工作区中的其他模块公开。
我所做的
在需要它们的每个模块中安装单独的 Firebase pod。启动时,我收到此错误:
.
The default FirebaseApp instance must be configured before the defaultFirebaseApp instance can be initialized
.
根据 Firebase 团队成员在另一篇 StackOverflow 帖子上的回答,这是由于工作区中存在多个 Firebase 库造成的。
仅安装了一个 pod 来创建一个“FirebaseProxy”模块,应用程序目标和所有其他模块都可以共享该模块。通过使用类型别名和扩展,我可以让类实现 Firebase 类,而不必暴露于实际的 Firebase 库,例如:
import Firebase
public typealias FirebaseUserProxy = Firebase.User
public extension FirebaseUserProxy {}
Run Code Online (Sandbox Code Playgroud)
因此,通过这种方式,实现类可以Firebase.User通过 usingFirebaseUserProxy来使用该类型,而不必直接暴露给 Firebase 库。
.
然而,有一些代理类似乎仍然需要暴露给完整的库。(我的大脑因为处理这一切而有点糊涂,所以我已经忘记了究竟是哪些,我相信它是 FirebaseApp。)但即使@_exposed import Firebase在代理定义中使用也没有成功,我只收到了消息Missing required module 'Firebase'。
与#2 中的解决方案相同,但use_frameworks! :linkage => :static在我的 Podfile 中使用。没运气。是的,我确实尝试$(SRCROOT)/Stat在我的框架中使用搜索路径构建设置。
最后,我尝试将库直接集成到我的项目中,而不使用 Cocoapods。在这里,我使用的是 6.26.0,因为6.27.0URL 中带有 a 的 Firebase 下载链接导致了一条Not Found消息,所以我手动将其更改为6.26.0并且下载得很好
。
我在应用程序和另一个模块中安装了该库,希望这种方法能够以某种方式将每个库与另一个库混淆,但最终得到与 #1... 相同的错误消息The default FirebaseApp...
。
我也尝试使用 #2 中的代理方法,但这导致了同样的错误。
.
我必须:linkage => :static在我的 Podfile 中进行设置,以便安装的 Pod 可以与集成库很好地配合使用。关闭它会导致错误。
备择方案
如果我不能让它工作,我可能必须重构我的代码,以便依赖 Firebase 的代码存在于应用程序本身而不是独立的框架模块中。这不会影响功能,但会破坏架构并使代码变得更加复杂和脆弱。
Firebase git repo 上有一个解决方案(我还没有尝试过),建议恢复到 v.6.15.0。我不愿意这样做,因为最新版本是 6.27.0,我不想无法升级并冒险使用旧版本,后者无疑最终会破坏。
最后
令人失望的是,如此广泛使用且至关重要的工具只能用于单体应用程序,基本上将开发人员限制在单一的、通常是次优的架构类型中。我错过了什么吗?也许。这不会是第一次。但是,如果有人能解决我的困境,我很乐意为您买杯啤酒,并考虑到当前的社会疏远规定,代表您饮用。
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |