更新:GCM已弃用,使用FCM

我正在实现新的谷歌云消息,遵循从谷歌开发人员页面这里的指南

我已经成功地运行并测试了它。但我现在的问题是,我有不同的产品口味,具有不同的applicationId/packageName和不同的谷歌云消息传递项目Id。谷歌服务。Json必须放在/app/google-services。Json,而不是flavor文件夹。

有没有办法让谷歌的服务。Json配置不同的许多口味?


当前回答

更新:下面的解释是针对一个Android Studio项目,该项目中有一个Firebase项目和不同的Firebase应用程序。 如果目标是在同一个Android Studio项目中的不同Firebase项目中为不同的Firebase应用程序提供不同的JSON文件,(或者如果你不知道有什么区别)请查看这里。

每个Android应用程序ID(通常是包名)需要一个Firebase应用程序。通常每个Gradle构建变体都有一个Application ID(如果你使用Gradle构建类型和Gradle构建风格,这可能会发生)


在谷歌服务3.0和使用Firebase时,不需要为不同的口味创建不同的文件。为不同的口味创建不同的文件可能不清楚或直接,如果你有productflavors和Build类型相互组合。

在同一个文件中,您将拥有所有构建类型和风格所需的所有配置。

在Firebase控制台中,您需要为每个包名称添加一个应用程序。假设您有两种风格(开发和实时)和两种构建类型(调试和发布)。这取决于你的配置,但很可能你有4个不同的包名,比如:

Com.stackoverflow.example(实时发布) dev (live - dev) debug (debug - release) debug (debug - dev)

在Firebase控制台中需要4个不同的Android应用程序。(在每一台计算机上,您需要添加SHA-1用于调试和运行您正在使用的每台计算机)

当你下载谷歌服务时。Json文件,实际上从哪个应用下载并不重要,它们都包含与所有应用相关的相同信息。

现在你需要在应用程序级别(app/)中定位这个文件。

如果您打开该文件,您将看到If包含所有包名称的所有信息。

一个痛点曾经是插件。为了让它工作,你需要在你的文件底部找到插件。这条线。

apply plugin: 'com.google.gms.google-services'

...需要在你的应用构建的底部。gradle文件。

对于这里所说的大多数,它也适用于以前的版本。我从来没有为不同的配置准备过不同的文件,但现在使用Firebase控制台更容易了,因为它们提供了一个文件,其中包含所有配置所需的所有内容。

重火力点文档 Firebase云消息 重火力点控制台

其他回答

所以如果你想通过编程复制google的服务。Json文件从你的所有变体到你的根文件夹。当你切换到特定的变体时,这里有一个解决方案

android {
  applicationVariants.all { variant ->
    copy {
        println "Switches to $variant google-services.json"
        from "src/$variant"
        include "google-services.json"
        into "."
    }
  }
}

这种方法有一个警告,那就是你需要有谷歌服务。Json文件在你的每个变体文件夹这里是一个例子。

我目前在同一个应用程序包中使用两个GCM项目Id。我加入了谷歌服务。我的第一个GCM项目的json,但我从第一个切换到第二个只改变SENDER_ID:

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

(在这一点上,我认为谷歌的服务。Json不是强制性的)

我发现google-services插件对于想要添加GCM的项目来说是非常无用的。它只生成以下文件,简单地将您的项目ID添加为字符串资源:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Your API key would be on the following line -->
    <string name="gcm_defaultSenderId">111111111111</string>
</resources>

似乎只有在直接从Cloud Messaging for Android指南复制样例代码时才需要它。下面是示例行:

String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),              GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

解决方案

如果您希望能够为不同的构建类型或产品风格切换API项目,您只需定义自己的常量,并在调用getToken() API时选择适当的常量。

private static final String SENDER_ID = "111111111111";
private static final String SANDBOX_SENDER_ID = "222222222222";

String token = instanceID.getToken(
        BuildConfig.DEBUG ? SENDER_ID : SANDBOX_SENDER_ID,
        GoogleCloudMessaging.INSTANCE_ID_SCOPE,
        null);

产品口味

上面的代码用于在调试和发布版本之间切换。对于产品类型,您可以在java源文件中定义不同的API键,并将这些文件放在相应的产品类型目录中。参考:Gradle Build variables

根据@ZakTaccardi的回答,并且假设您不想在两个版本中都使用一个项目,请将此添加到构建的末尾。gradle文件:

def appModuleRootFolder = '.'
def srcDir = 'src'
def googleServicesJson = 'google-services.json'

task switchToStaging(type: Copy) {
    outputs.upToDateWhen { false }
    def flavor = 'staging'
    description = "Switches to $flavor $googleServicesJson"
    delete "$appModuleRootFolder/$googleServicesJson"
    from "${srcDir}/$flavor/"
    include "$googleServicesJson"
    into "$appModuleRootFolder"
}

task switchToProduction(type: Copy) {
    outputs.upToDateWhen { false }
    def flavor = 'production'
    description = "Switches to $flavor $googleServicesJson"
    from "${srcDir}/$flavor/"
    include "$googleServicesJson"
    into "$appModuleRootFolder"
}

afterEvaluate {
    processStagingDebugGoogleServices.dependsOn switchToStaging
    processStagingReleaseGoogleServices.dependsOn switchToStaging
    processProductionDebugGoogleServices.dependsOn switchToProduction
    processProductionReleaseGoogleServices.dependsOn switchToProduction
}

你需要src/staging/google-services文件。Json和src/production/google-services.json。替换您所使用的风味名称。

    ...
    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'
                    }
                }
            }
        }
    }