在您的 Android 应用中使用两个 Firebase 实例,并且永远不要在生产环境中进行测试

在本文中,我将向您展示BeServed如何通过为单个 Android 项目创建两个 Firebase 实例来避免此类错误,其中一个用于测试,一个用于生产。

默认情况下,当我们想将 Firebase 项目添加到我们的 Android 应用程序时,Firebase 指南会要求我们将插件添加com.google.gms.google-services到我们的应用程序build.gradle文件中,下载文件并将其放入google-services.json应用程序文件夹中,因此您的应用程序将链接到Firebase 项目。

现在的问题是👇🏾

如何将一个 android 应用链接到两个 Firebase 项目

有两种可能:

第一个选项:使用多个 google-services.json

第一个是google-services.json为每个构建变体使用一个文件。实际上,您可以将多个google-services.json文件分别放置在根据其所属的构建变体命名的文件夹中。

例如,如果您有产品风味“开发”和“发布”,您可以按如下方式组织它们:

app/
    google-services.json
    src/dev/google-services.json
    src/release/google-services.json
...

该google-service.json文件由 Google Services gradle 插件处理为 Android 字符串资源。

然后,这些资源由FirebaseInitProvider在您的应用程序代码之前运行并使用这些值初始化 Firebase API 的程序加载。

第二个选项:在运行时使用 Firebase 选项对象检查

如您所知,JSON 文件在构建时进行处理,并将其读入FirebaseOptionsFirebase 应用程序对象 () 引用的选项对象 ( FirebaseApp)。此选项包括将字符串资源直接添加到您的应用程序,而不是使用 Google Services Gradle 插件。这就是我们在BeServed的做法。

首先你应该

  • 从根目录中删除google-services插件build.gradle
  • google-services.json从您的项目中删除
  • apply plugin: com.google.gms.google-services从您的应用中删除build.gradle

之后,您需要创建一个 Firebase 选项对象来保存 Firebase 应用程序的配置数据。它使用构建器模式,您可以指定一些信息,如下例所示。

val options =  FirebaseOptions.Builder()
        .setProjectId("my-firebase-project")
        .setApplicationId("1:27992087142:android:ce3b6448250083d1")
        .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw")
        .build()

项目 ID、应用程序 ID和API 密钥是必填字段,但在 API 参考文档中可以找到很多其他字段

在为每个实例创建一个选项变量之后,我们的 Application 类应该是这样的:

class App : Application() {
    override fun onCreate() {  
        super.onCreate()
        val devOptions =  FirebaseOptions.Builder()
                .setProjectId("beserved-development-project")
                .setApplicationId("1:212877806437:android:fee5f52927e2f7a907ed8c")
                .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw")
                .build()

        val prodOptions =  FirebaseOptions.Builder()
                .setProjectId("beserved-production-project")
                .setApplicationId("1:27992087142:android:ce3b6448250083d1")
                .setApiKey("BIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw")
                .build()

        // here we check wich instance to use depending on the build type        
        if(BuildConfig.DEBUG) {
            FirebaseApp.initializeApp(this, devOptions, "beserved-development")
        } else {
            FirebaseApp.initializeApp(this, prodOptions, "beserved-production")
        }
    }
}

现在我们的应用会在 Firebase 项目之间动态切换,第三个参数initializeApp()是实例名称,所以如果我们想使用 Firestore,我们应该提供相应实例的名称,我们也可以通过检查来动态更改这个名称如果BuildConfig是调试与否。

val instanceName = if (BuildConfig.DEBUG) "beserved-development" else "beserved-production"
FirebaseApp.getInstance(instanceName)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值