更新:GCM已弃用,使用FCM

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

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

有没有办法让谷歌的服务。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

其他回答

1)。谷歌提供什么服务?Json真的有用吗?

关注这个:https://stackoverflow.com/a/31598587/2382964

2)。谷歌是如何服务的。Json文件影响你的android工作室项目?

关注这个:https://stackoverflow.com/a/33083898/2382964

简单来说就是第二个url,如果你添加google-services。Json在你的项目中必须有一个自动生成的google-services文件夹在这个路径下调试变量

app/build/generated/res/google-services/debug/values/values.xml

3)。该怎么做,才能把事情做好?

在project_level构建中添加google-services依赖项。Gradle,如果你使用app_compact库,你也可以使用3.0.0版本。

// Top-level build.gradle file
classpath 'com.google.gms:google-services:2.1.2'

现在在app_level build中。你必须在底部添加Gradle。

// app-level build.gradle file
apply plugin: 'com.google.gms.google-services'

注意:在gradle文件底部添加这一行非常重要。否则Gradle构建不会给你任何错误,但它不能正常工作。

4)。谷歌服务该放在哪里?Json文件在你的结构。

如果你没有build_flavor,就把它放在inside /app/google-service中。json文件夹。

情况2.)如果你有多个build_flavor并且你有不同的google_services。Json文件放在app/src/build_flavor/google-service.json中。

情况3.)如果你有多个build_flavor和单个google_services。Json文件放在app/google-service.json中。

根据ahmed_khan_89的回答,您可以将“复制代码”放在产品风味中。

productFlavors {
    staging {
        applicationId = "com.demo.staging"

        println "Using Staging google-service.json"
        copy {
            from 'src/staging/'
            include '*.json'
            into '.'
        }
    }
    production {
        applicationId = "com.demo.production"

        println "Using Production google-service.json"
        copy {
            from 'src/production/'
            include '*.json'
            into '.'
        }
    }
}

这样你就不必手动切换设置了。

你有很多口味,所以这意味着你会有很多不同的包装id,对吧?所以,只需转到您设置/生成json文件和配置每个包名的页面。所有这些都将添加到json文件中。

我现在很懒发布照片,但基本上:

访问https://developers.google.com/mobile/add 选择平台 选择你的应用 重要:输入你的口味包名称字段“android包名称” ... 继续获取配置文件。下载它!

当配置文件时,您可以看到谷歌向您显示服务器API密钥+发送方ID。所有包装(口味)都是一样的

最后,您只需要一个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云消息 重火力点控制台

我们对调试构建有不同的包名(*.debug),所以我想要一些基于flavor和buildType的东西,而不必在processDebugFlavorGoogleServices的模式中编写任何与flavor相关的东西。

我在每个版本中创建了一个名为“google-services”的文件夹,包含了json文件的调试版本和发布版本:

在gradle文件的buildTypes部分,添加以下内容:

    applicationVariants.all { variant ->
            def buildTypeName = variant.buildType.name
            def flavorName = variant.productFlavors[0].name;

            def googleServicesJson = 'google-services.json'
            def originalPath = "src/$flavorName/google-services/$buildTypeName/$googleServicesJson"
            def destPath = "."

            copy {
                if (flavorName.equals(getCurrentFlavor()) && buildTypeName.equals(getCurrentBuildType())) {
                    println originalPath
                    from originalPath
                    println destPath
                    into destPath
                }
            }
    }

当你切换构建变量时,它会自动在你的应用模块的根处复制正确的json文件。

在build.gradle的根中添加这两个被调用的方法,以获取当前风格和当前构建类型

def getCurrentFlavor() {
    Gradle gradle = getGradle()
    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;

    if( tskReqStr.contains( "assemble" ) )
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher( tskReqStr )

    if( matcher.find() ) {
        println matcher.group(1).toLowerCase()
        return matcher.group(1).toLowerCase()
    }
    else
    {
        println "NO MATCH FOUND"
        return "";
    }
}

def getCurrentBuildType() {
    Gradle gradle = getGradle()
    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

        if (tskReqStr.contains("Release")) {
            println "getCurrentBuildType release"
            return "release"
        }
        else if (tskReqStr.contains("Debug")) {
            println "getCurrentBuildType debug"
            return "debug"
        }

    println "NO MATCH FOUND"
    return "";
}

就是这样,你不必担心从你的gradle文件中删除/添加/修改口味,它得到调试或发布谷歌服务。自动json。