如何在 Flutter 中设置不同的 firebase 环境
Posted
技术标签:
【中文标题】如何在 Flutter 中设置不同的 firebase 环境【英文标题】:How to setup different firebase environments in Flutter 【发布时间】:2018-10-25 18:12:31 【问题描述】:我正在尝试弄清楚如何在颤振项目中设置不同的 firebase 环境。
我了解如何在 firebase 中执行此操作,我创建了两个项目,一个用于生产,一个用于测试。然后,在 ios 或 android 项目中,我可以使用不同的方法在这两个环境之间切换,使用单独的 google-services.json
或 GoogleServices-Info.plist
文件。
在 Flutter 中我发现 this 描述了如何分离环境,但它只解释了如何区分 Flutter 代码中的环境。
如何让这个环境在编译时更改 iOS 和 Android 的构建?甚至在构建时允许文件复制钩子就足够了。
【问题讨论】:
【参考方案1】:您可以使用 FirebaseApp.configure 切换帐户。您可以提供自己的解决方案或秘密开发面板在它们之间进行切换。
当您为 TestFlight 部署时,解决方案将构建风味,而 plist 实现会将您锁定在构建中 + 它们很混乱。
这是一个示例:(您也可以使用资产。)
// Load a named file.
let filePath = Bundle.main.path(forResource: "MyGoogleService", ofType: "plist")
guard let fileopts = FirebaseOptions(contentsOfFile: filePath!)
else assert(false, "Couldn't load config file")
FirebaseApp.configure(options: fileopts)
【讨论】:
您有使用 Dart 代码执行此操作的示例吗?我没有看到FirebaseOptions
可以选择contentsOfFile
。我确实看到了传递单个属性的选项,但不是 json/plist 服务文件中的所有属性都被 Flutter 中的FirebaseOptions
接受。【参考方案2】:
Salvatore Giordano 写了一篇博文,详细描述了如何实现这一目标:
https://medium.com/@salvatoregiordanoo/flavoring-flutter-392aaa875f36
Flutter 接受一个参数--flavor=<flavor>
,它允许您选择不同的构建风格。在 Android 中,这可以按预期工作,选择不同的构建风格。 IOS 有点小技巧,因为每种风格都需要一个方案,而且还需要Release-<flavor>
形式的构建配置。
一旦这些部件就位,就可以使用它们来选择 Firebase 配置,就像在任何 iOS 或 Android 项目中一样。
挑战在于让 Dart 代码也能意识到这种风格,而博客文章对此没有提供好的解决方案。它建议可以使用使用不同入口点的标准方法,但正确的入口点必须由调用应用程序的人手动匹配正确的风格。
【讨论】:
付费链接真的没用【参考方案3】:我写了一篇关于如何在 dart 代码中使用风味和平台通道进行 Firebase 配置和运行时配置的文章。
https://medium.com/@matt.goodson.business/separating-build-environment-configurations-in-flutter-with-firebase-doing-it-the-right-way-c72c3ad3621f
Flutter 风格可以与 Android 风格无缝协作。对于 iOS,您需要为每种风格创建 Xcode 方案并将它们链接到构建配置。
对于 dart 配置,您可以使用平台通道在运行时获取构建期间使用的风味。这使您可以在没有多个 main.dart 文件或传递目标参数的情况下配置应用程序。
【讨论】:
嘿,你不需要这样做。您可以在运行时加载不同的文件。看我的回答。构建风格很糟糕,例如 QA 将如何测试 TestFlight 构建以及许多其他问题。【参考方案4】:对于 Firebase 环境配置,您可以使用 CodeMagic 中的 this article 和 this article,这说明了如何使用构建环境变量设置 plist
文件。
如果您需要在 Dart 代码中包含一组不同的值,例如一个选项,您可以使用 this package。它允许从控制台命令参数生成 Dart 类配置文件。
2020 年 12 月 5 日更新
从 Flutter 1.17 开始,您实际上可以在 flutter run
和 flutter build
命令中使用带有 --dart-define
参数的编译时变量
Here is an article that describes how to specify and use them。
【讨论】:
【参考方案5】:随着 Flutter for Web 发布到稳定频道,我整理了instructions for targeting multiple firebase projects (e.g. dev, staging, prod) from multiple build platforms (i.e. iOS, Android, and Web)。
【讨论】:
以上是关于如何在 Flutter 中设置不同的 firebase 环境的主要内容,如果未能解决你的问题,请参考以下文章