不同 productFlavors 的 google-services.json

574

更新:GCM已被弃用,请使用FCM

我正在按照谷歌开发者页面此处的指南实现新的Google Cloud Messaging。

我已经成功运行和测试了它。但是我的问题是,我有不同的产品风味,具有不同的applicationId/packageName和不同的Google Cloud Messaging项目ID。 google-services.json必须放在/app/google-services.json而不是风味文件夹中。

是否有任何方法使google-services.json配置对于许多风味不同?


对于Maven,我们使用Maven配置文件和为每个配置文件单独创建的属性文件实现了类似的功能。 - sakis kaliakoudas
1
如果您只想使用sender_id,则可以在Google控制台中生成不带任何包名的密钥。 - Murtaza Khursheed Hussain
在Gradle文件中的apply plugin: 'com.google.gms.google-services'行似乎会将gcm字符串放入app/build/generated/res/google-services/debug/values/values.xml - Alexander Farber
我找到的最佳答案是在这个问题上 - Estel
1
请务必阅读此文:https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html 它涵盖了所有可能性和权衡。 - Albert Vila Calvo
迄今为止我发现的答案是:https://stackoverflow.com/a/66739849/3970630 - Ric17101
28个回答

2

嘿,朋友们,还要注意使用小写字母的名称,这样就不会出现错误了。


2

简单回答:

  • 实现:默认情况下,您应该将 google-services.json 复制到 app 目录。

对于其他的 flavor,请将 google-services.json 复制到 app/src/{flavor-name} 目录中。

  • 测试:尝试构建项目,打开 Build 选项卡,然后检查输出信息是否包含 Parsing json file:.....

1

实际上,在MyApp/app/目录中只需要一个google-services.json文件即可,无需额外使用com.google.gms:google-services:3.0.0的脚本。但是请注意删除应用程序目录MyApp/app/src/flavor1/res/中的文件google-services.json,以避免出现错误类型Execution failed for task ':app:processDebugGoogleServices'. > No matching client found for package


0

我目前在同一个应用程序包中使用两个 GCM 项目 ID。我放置了第一个 GCM 项目的 google-service.json,但我只需更改 SENDER_ID 就可以从第一个切换到第二个。

    String token = instanceID.getToken(SENDER_ID,GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

我认为此时google-services.json并非强制必需品。


0
受@ahmed_khan_89上面的答案启发,我们可以直接在gradle文件中保留这样的内容。
android{

// set build flavor here to get the right Google-services configuration(Google Analytics).
    def currentFlavor = "free" //This should match with Build Variant selection. free/paidFull/paidBasic

    println "--> $currentFlavor copy!"
    copy {
        from "src/$currentFlavor/"
        include 'google-services.json'
        into '.'
    }
//other stuff
}

0
你有许多口味,这意味着你会有许多不同的包ID,对吗?所以,只需转到设置/生成json文件并为每个包名称进行配置的页面。所有这些都将添加到json文件中。
我现在非常懒得发图片,但基本上:
- 转到https://developers.google.com/mobile/add - 选择平台 - 选择您的应用程序 - 重要提示:在“android软件包名称”字段中输入您的flavor软件包名称 - …继续获取您的配置文件。下载它!
配置文件时,您可以看到Google向您显示Server API Key + Sender ID。对于所有包(flavors)都是相同的。
最后,您只需要一个json文件即可涵盖所有口味。
这里还有一个问题,您必须测试注册以获取注册令牌时是否有差异。我没有触及它,但我认为它应该是不同的。现在太晚了,我很困 :) 希望能帮到你!

0
    ...
    gradle.taskGraph.beforeTask { Task task ->
        if (task.name ==~ /process.*GoogleServices/) {
            android.applicationVariants.all { variant ->
                if (task.name ==~ /(?i)process${variant.flavorName}(Debug|Release)GoogleServices/) {
                    copy {
                        from "src/tenants/${variant.flavorName}"
                        include 'google-services.json'
                        into '.'
                    }
                }
            }
        }
    }

    gradle.taskGraph.afterTask { Task task ->
        if (task.name ==~ /process.*GoogleServices/) {
            android.applicationVariants.all { variant ->
                if (task.name ==~ /(?i)process${variant.flavorName}(Debug|Release)GoogleServices/) {
                    delete fileTree(".").matching {
                        include 'google-services.json'
                    }
                }
            }
        }
    }

0

将您的 "google-services.json" 文件分别放置在 app/src/flavors 下,然后在应用程序的 build.gradle 中,在 android 下添加以下代码

gradle.taskGraph.beforeTask { Task task ->
        if (task.name ==~ /process.*GoogleServices/) {
            android.applicationVariants.all { variant ->
                if (task.name ==~ /(?i)process${variant.name}GoogleServices/) {
                    copy {
                        from "/src/${variant.flavorName}"
                        into '.'
                        include 'google-services.json'
                    }
                }
            }
        }
    }

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