如何在Flutter中设置不同的Firebase环境

27

我正在尝试弄清楚如何在Flutter项目中设置不同的Firebase环境。

我知道如何在Firebase中做到这一点,我创建了两个项目,一个用于生产环境,一个用于测试环境。然后,在iOS或Android项目中,我可以使用各种方法来使用单独的google-services.jsonGoogleServices-Info.plist文件在这两个环境之间切换。

在Flutter中,我找到了这篇文章,介绍了如何区分环境,但它只解释了如何在Flutter代码中区分环境。

我该如何使得iOS和Android在编译时根据不同环境构建?甚至允许在构建时进行文件复制也足够了。

6个回答

4
你可以使用FirebaseApp.configure来切换账号。你可以提供自己的解决方案或秘密开发面板来在它们之间进行切换。
使用构建变体的解决方案很糟糕,而且plist实现会在部署到TestFlight时锁定构建,而且它们也很混乱和慢。
这里有一个没有愚蠢构建变体的例子:(你也可以使用资源文件。)
// 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的选项。我看到可以传递单个属性的选项,但是在Flutter中,不是所有json/plist服务文件中的属性都被FirebaseOptions接受。 - jdixon04
@jdixon04 他们修复了很多问题。现在应该完全正常运行了。 - Oliver Dixon

3
我写了一篇关于如何使用 flavors 和平台通道在dart代码中为Firebase配置以及运行时配置的文章。
对于Android flavors,Flutter flavors可以非常顺畅地工作。 对于iOS,您需要为每个 flavor 创建 Xcode 方案,并将它们链接到构建配置。
对于dart配置,您可以使用平台通道在运行时获取构建过程中使用的flavor。 这使您可以配置应用程序,而不需要多个 main.dart 文件或传递目标参数。
参考链接:https://medium.com/@matt.goodson.business/separating-build-environment-configurations-in-flutter-with-firebase-doing-it-the-right-way-c72c3ad3621f

2
嘿,你不需要这样做。你可以在运行时加载不同的文件。看看我的答案。构建口味很糟糕,QA怎么测试TestFlight构建,例如还有许多其他问题。 - Oliver Dixon

1

Salvatore Giordano撰写了一篇博客文章,详细描述了如何实现这一目标:

https://medium.com/@salvatoregiordanoo/flavoring-flutter-392aaa875f36

Flutter接受一个参数--flavor=<flavor>,允许您选择不同的构建风格。在Android中,这可以按预期工作,选择不同的构建风格。IOS有点棘手,因为每个风格都需要一个方案,并且还需要以Release-<flavor>形式的构建配置。
一旦这些部分就位,它们可以用于选择firebase配置,就像在任何iOS或Android项目中一样。
挑战在于让Dart代码也能意识到风格,而博客文章没有提供好的解决方案。它建议使用不同的入口点的标准方法,但必须由调用应用程序的人手动匹配正确的入口点和正确的风格。

1
付费链接并不是真正有用的。 - David Ritchie


0

关于 Firebase 环境配置,您可以使用 CodeMagic 的 this articlethis article,其中解释了如何使用构建环境变量设置 plist 文件。

如果您需要在 Dart 代码中使用不同的值集,例如选项,则可以使用 this package。它允许从控制台命令参数生成 Dart 类配置文件。

更新于 2020 年 12 月 5 日

自 Flutter 1.17 版本以来,您实际上可以使用编译时变量和 --dart-define 参数在 flutter runflutter build 命令中使用。

这里有一篇文章描述了如何指定和使用它们


0

晚来的聚会,但对于将来的其他人。如果您正在使用Firebase和--dart-define,请阅读此内容,因为我刚刚花了一整天弄清楚这个问题。

所以官方文档说在firebase.json文件中使用'source'。https://firebase.google.com/docs/hosting/frameworks/flutter 不清楚的是,当您在配置中使用source时,在运行firebase deploy时,它会构建Flutter应用程序。这会清除之前发送的任何构建参数,即使您只是使用了--dart-define参数进行构建。

解决方案是将您的firebase.conf文件更改为类似以下内容:

{
  "hosting": {
    "public": "build/web",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "frameworksBackend": {
      "region": "us-central1"
    },
    "rewrites": [ {
   "source": "**",
   "destination": "/index.html"
} ]
  }
}

然后构建您的应用程序
flutter build --dart-define=envFileName=local.env
然后部署
firebase deploy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接