更新:GCM已弃用,使用FCM

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

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

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


当前回答

只需在同一个项目中添加调味应用程序id和口味的名称,下载google-service。Json文件,它将在客户端数组[]中包含所有口味,这将适用于所有口味。

其他回答

我也遇到了同样的问题,但找不到完美的解决方案。这只是个变通办法。 我在想谷歌怎么就没想过口味呢?我希望他们能尽快提出更好的解决方案。

我在做什么:

我有两种风格,在每一种风格中我都放入了相应的google服务。Json: src/flavor1/google-services。Json和src/flavor2/google-services。json。

然后在构建gradle中,我根据应用程序/目录的口味复制文件:

android {

// set build flavor here to get the right gcm configuration.
//def myFlavor = "flavor1"
def myFlavor = "flavor2"

if (myFlavor.equals("flavor1")) {
    println "--> flavor1 copy!"
    copy {
        from 'src/flavor1/'
        include '*.json'
        into '.'
    }
} else {
    println "--> flavor2 copy!"
    copy {
        from 'src/flavor2/'
        include '*.json'
        into '.'
    }
}

// other stuff
}

限制:每次你想运行一个不同的口味时,你必须在gradle中手动更改myFlavor(因为它是硬编码的)。

我尝试了很多方法来获得当前的构建风格,比如afterEvaluate关闭…直到现在都找不到更好的解决办法了。

更新,另一个解决方案:一个谷歌服务。Json的所有口味:

你也可以,为每个口味有不同的包名,然后在谷歌开发控制台,你不需要为每个口味创建两个不同的应用程序,只需要在同一个应用程序中创建两个不同的客户端。 那么你就只有一个google服务了。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云消息 重火力点控制台

简化@Scotti说的话。您需要为特定项目创建多个具有不同包名的应用程序,具体取决于产品风格。

假设您的项目是ABC,具有不同的产品风味X,Y,其中X有一个包名com。x和Y有一个包名为com。然后在firebase控制台中,你需要创建一个项目ABC,其中你需要创建2个包名为com的应用程序。X和com.y。然后你需要下载谷歌服务。Json文件中有2个client-info对象,其中包含这些包,你就可以开始了。

json的代码片段如下所示

{
  "client": [
    {
      "client_info": {
        "android_client_info": {
          "package_name": "com.x"
        }

    {
      "client_info": {
        "android_client_info": {
          "package_name": "com.y"
        }
      ]

    }

放置你的“谷歌服务”。Json”文件分别在app/src/flavors下 然后是构建。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'
                    }
                }
            }
        }
    }

我正在使用谷歌服务。json文件,从这里创建:https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging%2Fandroid%2Fclient&cntlbl=Continue%20Adding%20GCM%20Support&%3Fconfigured%3Dtrue

在json结构中,有一个称为客户机的json数组。如果你有多种口味,只需在这里添加不同的属性。

{
  "project_info": {
    "project_id": "PRODJECT-ID",
    "project_number": "PROJECT-NUMBER",
    "name": "APPLICATION-NAME"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:PROJECT-NUMBER:android:HASH-FOR-FLAVOR1",
        "client_id": "android:PACKAGE-NAME-1",
        "client_type": 1,
        "android_client_info": {
          "package_name": "PACKAGE-NAME-1"
        }
      },
      "oauth_client": [],
      "api_key": [],
      "services": {
        "analytics_service": {
          "status": 1
        },
        "cloud_messaging_service": {
          "status": 2,
          "apns_config": []
        },
        "appinvite_service": {
          "status": 1,
          "other_platform_oauth_client": []
        },
        "google_signin_service": {
          "status": 1
        },
        "ads_service": {
          "status": 1
        }
      }
    },
    {
      "client_info": {
        "mobilesdk_app_id": "1:PROJECT-NUMBER:android:HASH-FOR-FLAVOR2",
        "client_id": "android:PACKAGE-NAME-2",
        "client_type": 1,
        "android_client_info": {
          "package_name": "PACKAGE-NAME-2"
        }
      },
      "oauth_client": [],
      "api_key": [],
      "services": {
        "analytics_service": {
          "status": 1
        },
        "cloud_messaging_service": {
          "status": 2,
          "apns_config": []
        },
        "appinvite_service": {
          "status": 1,
          "other_platform_oauth_client": []
        },
        "google_signin_service": {
          "status": 1
        },
        "ads_service": {
          "status": 1
        }
      }
    }
  ],
  "client_info": [],
  "ARTIFACT_VERSION": "1"
}

在我的项目中,我使用相同的项目id,当我在上面的url中添加第二个package-name时,谷歌为我提供了一个包含json-data中的多个客户端的文件。