不同产品的google-services.json


453

更新: 不建议使用GCM,请使用FCM

我实施新的谷歌云消息之后从谷歌开发者页面的导游在这里

我已经成功运行并测试了它。但是我现在的问题是,我有不同的产品风格和不同的applicationId / packageName和不同的Google Cloud Messaging Project ID。在google-services.json具有在被投入/app/google-services.json不是味道文件夹。

有什么办法可以使google-services.json多种口味的配置有所不同?


对于Maven,我们已经使用maven配置文件和针对每个配置文件的单独属性文件实施了类似的操作
sakis kaliakoudas 2015年

1
如果您只想使用sender_id,则可以从Google控制台生成没有任何程序包名称的密钥。
Murtaza Khursheed Hussain

apply plugin: 'com.google.gms.google-services'gradle文件中的行似乎将gcm字符串放入app/build/generated/res/google-services/debug/values/values.xml...
Alexander Farber

我为此找到的最佳答案是这个问题
Estel

请务必阅读以下内容:firebase.googleblog.com/2016/08/…它涵盖了所有可能性和权衡因素。
艾伯特·维拉·卡尔沃

Answers:


509

Google在播放服务插件的2.0版中包括了对口味的支持。由于此版本gradle plugin com.google.gms:google-services:2.0.0-alpha3

你可以这样做

app/src/
    flavor1/google-services.json
    flavor2/google-services.json

插件的版本3.0.0在以下位置搜索json文件(考虑到您具有flavorflavor1和构建类型debug):

/app/src/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json

即使使用flavourDimensions,这也对我有用。我在一个维度上具有免费和付费,而在另一个维度上具有Mock&Prod。我也有3个buildType:调试,发布和登台。这就是我的项目中FreeProd风格的外观:

在此处输入图片说明

多少google-services.json文件将取决于您项目的特征,但每个Google项目至少需要一个json文件。

如果您想了解有关此插件如何处理这些json文件的更多详细信息,请访问:https : //github.com/googlesamples/google-services/issues/54#issuecomment-165824720

链接到官方文档:https : //developers.google.com/android/guides/google-services-plugin

博客文章,其中包含更新的信息:https : //firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html

然后转到此处查看此插件的最新版本:https : //bintray.com/android/android-tools/com.google.gms.google-services/view


13
由于某些原因,这对我不起作用-我收到gradle构建错误- File google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.因此,我将每次通过构建脚本将诉诸于味觉文件复制到根文件夹中。
dodgy_coder

2
像魅力一样工作,为此感谢上帝。google-services.json和使用其api的全新方法似乎倒退了一步。不知道这怎么会更容易。
RED_

140
googl-services.json真是可恶...与仅插入API密钥和发件人ID相比,如何管理一些疯狂的json文件更容易?请谷歌停止废话
格雷格·恩尼斯

19
最新版本的配置文件生成器将多个属性放在同一个配置文件中,只需要再次在应用程序级别使用一个属性,而不是在风味级别使用单独的属性。您只需要确保两个配置均在相同的“应用程序名称”字段下生成。
sroskelley

5
从Android Studio 3.1.4开始,使用/app/src/flavor1/google-services.json不再有效。这些文件必须位于/app/src/flavor1/debug/google-services.json和/app/src/flavor1/release/google-services.json中。
nurider

71

更新:以下说明适用于一个Android Studio项目,该项目中包含一个Firebase项目和不同的Firebase应用程序。如果目标是在同一Android Studio项目内的不同Firebase项目中为不同的Firebase应用程序使用不同的JSON文件,(或者如果您不知道有什么区别),请查看此处。

每个Android应用程序ID(通常是程序包名称)需要一个Firebase App。通常每个Gradle构建变体都有一个Application ID(如果您使用Gradle构建类型和Gradle构建风格,则很可能会出现这种情况)


作为 Google Services 3.0开始,使用Firebase不必为不同的口味创建不同的文件。如果您具有相互组合的productFlavours和Build类型,则为不同的口味创建不同的文件可能并不清晰或直接。

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

在Firebase控制台中,您需要为每个程序包名称添加一个应用程序。想象一下,您有2种口味(开发和发布)和2种构建类型(调试和发布)。根据您的配置,但您可能有4个不同的软件包名称,例如:

  • com.stackoverflow.example(实时发布)
  • com.stackoverflow.example.dev(实时-开发)
  • com.stackoverflow.example.debug(调试-版本)
  • com.stackoverflow.example.dev.debug(调试-开发)

您需要在Firebase控制台中使用4个不同的Android应用程序。(在每台计算机上,您需要添加SHA-1进行调试,并为所使用的每台计算机实时运行)

当您下载google-services.json文件时,实际上从哪个应用程序下载它并不重要,它们都包含与所有应用程序相关的相同信息。

现在,您需要在应用程序级别(app /)中找到此文件。

在此处输入图片说明

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

痛点曾经是插件。为了使其正常工作,您需要在文件底部找到插件。所以这条线..

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

...需要位于应用程序build.gradle文件的底部。

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


我是从developers.google.com/mobile/add生成的,只有一个机会输入一个包名称。Firebase的设置位置在哪里,或者具有多种口味的google-services.json文件是什么样的
CQM 2016年

@CQM我已经更新了答案,并添加了一些链接。您可以查看Firebase文档,并可以如答案中所述在Firebase控制台中生成JSON文件。
索蒂

7
这是一个非常好的答案,应该是该问题的唯一正确答案。
南多

1
正如您在上面描述的那样,当我遇到同样的问题时,我自己发现了这个问题。我来这里是为后代提交答案,结果发现您已经做过。对于3.0.0版,这无疑是最好的答案。
Tash Pemhiwa'1

6
请注意,这仅在您所有的口味都在同一firebase项目中时才有效。如果使用多个项目(我倾向于在一个Firebase项目中保留开发和阶段性,并在不同的Google帐户中使用单独的专用prod projet生产prod),则需要Yair Kukielka概述的解决方案。实际上,该插件似乎支持多种路径-在构建过程中,您将获得有关该插件在何处查找google-services.json文件的提示:“在[src / prod中查找时找不到google-services.json / debug,src / debug / prod,src / prod,src / debug,src / prodDebug]“
JHH

43

写了一篇中篇文章在这个问题上。

遇到了类似的问题(使用BuildTypes代替Flavors),并像这样修复了它。

利用Gradle的依赖管理系统。我创建了两个任务,switchToDebugswitchToRelease。要求任何时间assembleRelease都在运行,那switchToRelease也要运行。调试相同。

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

task switchToDebug(type: Copy) {
    def buildType = 'debug'
    description = 'Switches to DEBUG google-services.json'
    from "${srcDir}/${buildType}"
    include "$googleServicesJson"
    into "$appModuleRootFolder"
}

task switchToRelease(type: Copy) {
    def buildType = 'release'
    description = 'Switches to RELEASE google-services.json'
    from "${srcDir}/${buildType}/"
    include "$googleServicesJson"
    into "$appModuleRootFolder"
}

afterEvaluate {
    processDebugGoogleServices.dependsOn switchToDebug
    processReleaseGoogleServices.dependsOn switchToRelease
}

编辑:使用processDebugFlavorGoogleServices/ processReleaseFlavorGoogleServices任务在每个口味级别对其进行修改。


但这适用于buildTypes,不适用于OP发布的味道
bryant1410

1
@ bryant1410(如果您使用的是风味)-我猜您可以改而加入processDebugFlavorGoogleServices任务。
ZakTaccardi 2015年

我认为您应该在答案中更改它,因为问题是关于样式而不是buildTypes。我认为您也可以将此答案作为第二种选择
bryant1410

1
@ bryant1410的味道或buildType的逻辑基本相同。您应该能够弄清楚
ZakTaccardi 2015年

1
@IgorGanapolsky是的,有两个版本
ZakTaccardi

13

好吧,我遇到了同样的问题,无法获得完美的解决方案。这只是一个解决方法。我想知道Google如何不考虑口味...?我希望他们能尽快提出更好的解决方案。

我在做什么:

我有两种口味,在每种口味中,我都放置了相应的google-services.json:src/flavor1/google-services.jsonsrc/flavor2/google-services.json

然后在build gradle中,根据风格将文件复制到app/目录:

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
}

局限性:每次您要运行不同的口味时,都必须myFlavor 手动更改gradle(因为它是硬编码的)。

我尝试了很多方法来使当前的构建风格afterEvaluate变得接近……直到现在都找不到更好的解决方案。

更新,另一种解决方案:一个针对所有口味的google-services.json:

您也可以为每种口味使用不同的程序包名称,然后在google开发人员控制台中不必为每种口味创建两个不同的应用程序,而在同一应用程序中只需创建两个不同的客户端即可。这样,您将只有一个google-services.json包含两个客户端的客户端。当然,这取决于您如何实现口味的后端。如果他们没有分开,那么该解决方案将无法为您提供帮助。


您的意思是,如果后端分开,那么这对您不起作用
ZakTaccardi 2015年

一切都取决于您对双方口味的定义;客户端和服务器。就我而言,不同的包名称,不同的服务器URL和不同的数据库。因此,服务器会将通知发送到相应数据库中的用户。用户A拥有针对flavor1的令牌1和针对flavor2的令牌2。如果您有不同的数据库条目,那么您将没有任何问题。
ahmed_khan_89

我尝试创建可复制的任务,然后在特定的调试过程或发布过程中调用它们,并认为这可行。希望此ws早些时候发布
humblerookie 2015年

1
使用一个google-services.json两个release,并debug为我工作,在您的更新提及。我认为,如果您debug像我一样仅尝试拆分构建,这是最简单的解决方案。作为参考,您可以在此处生成文件:developers.google.com/mobile/add?
platform=android

12

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

然后,您不必手动切换设置。


2
@ZakTaccardi,但问题是味道,而不是构造类型
bryant1410


2
不起作用 这将运行两个复制命令,而与构建风格无关,因此生产json始终位于app目录中。
以撒

它确实适合口味。无需在build.gradle中手动切换变量。
Vito Valov '16

9

我正在使用从此处创建的google-services.json文件:https : //developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https :% 2F% 2Fdevelopers.google.com%2Fcloud- messaging %2Fandroid%2Fclient&cntlbl =继续%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"
}

在我的项目中,我使用相同的project-id,并且在上述url中添加第二个包名称时,google为我提供了一个在json-data中包含多个客户端的文件。

抱歉,紧凑型JSON数据。我无法正确格式化...


8

不需要google-services.json文件即可接收通知。只需在build.gradle文件中为每种口味添加一个变量:

buildConfigField "String", "GCM_SENDER_ID", "\"111111111111\""

注册时,请使用此变量BuildConfig.GCM_SENDER_ID代替getString(R.string.gcm_defaultSenderId):

instanceID.getToken(BuildConfig.GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

6

1.)google-services.json到底做什么?

跟随这个:https : //stackoverflow.com/a/31598587/2382964

2.)google-services.json文件如何影响您的android studio项目?

跟随这个:https : //stackoverflow.com/a/33083898/2382964

只是第二个URL的简写,如果您在项目中添加google-services.json,则此路径中必须有一个自动生成google-servicesdebug变体 文件夹

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

3.)做什么,才能完成?

project_levelbuild.gradle中添加google-services依赖项,version 3.0.0如果您正在使用app_compact库,也可以使用。

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

现在在app_levelbuild.gradle中,您必须在底部添加。

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

4.)将google-service.json文件放在您的结构中的位置。

情况1.)如果没有build_flavor,则将其放入其中 /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


4

无需任何其他gradle脚本。

Google开始以“ android_client_info”的名称添加其他软件包名称。看起来像下面的google-services.json

"android_client_info": {
      "package_name": "com.android.app.companion.dev"
    }

因此,执行以下步骤足以选择不同的google-services.json。

  1. 有2种口味
  2. 将新的开发工具包添加到Google Analytics(分析)配置页面,然后下载google-services.json。
  3. 请注意,在新的配置文件中,您的风味的两个包装ID都在其中
  4. 准备任何风味的食物。

这就对了!..


1
我不确定2)和3)指的是什么。除了链接Play商店外,我在analytics.google.com上找不到可以添加程序包名称的任何位置。我找到的唯一可下载json的位置是从此处developers.google.com/mobile/add,它不允许添加多个程序包名称。只需手动将包名称添加到android_client_info即可工作吗?
arberg 2015年

1
@arberg您可以将多个软件包名称添加到同一项目中,然后下载文件。在这里查看:github.com/googlesamples/google-services/issues/54
Christer Nordvik,

4

我们为调试版本(* .debug)使用了不同的包名称,因此我需要一种基于flavor和buildType的东西,而不必以的方式编写任何与flavor相关的内容processDebugFlavorGoogleServices

我在每种样式中都创建了一个名为“ 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文件中删除/添加/修改口味,它会自动获取调试信息或发布google-services.json。


4

Firebase现在通过一个google-services.json文件支持多个应用程序ID。

这篇博客文章对其进行了详细描述。

您将在Firebase中创建一个父项目,并将其用于所有变体。然后,您在Firebase中为该项目下的每个应用程序ID创建单独的Android应用程序。

创建所有变体后,您可以下载支持所有应用程序ID的google-services.json。如果需要单独查看数据(例如崩溃报告),则可以使用下拉菜单进行切换。


4

根据Firebase文档,您还可以使用字符串资源代替google-services.json

由于此提供程序只是在读取具有已知名称的资源,因此另一种选择是将字符串资源直接添加到您的应用程序中,而不是使用Google Services gradle插件。您可以通过以下方式做到这一点:

  • google-services从根目录build.gradle中删除插件
  • google-services.json从您的项目中删除
  • 直接添加字符串资源
  • 删除应用插件:'com.google.gms.google-services'从您的应用程序build.gradle中

范例strings.xml

<string name="google_client_id">XXXXXXXXX.apps.googleusercontent.com</string>
<string name="default_web_client_id">XXXX-XXXXXX.apps.googleusercontent.com</string>
<string name="gcm_defaultSenderId">XXXXXX</string>
<string name="google_api_key">AIzaXXXXXX</string>
<string name="google_app_id">1:XXXXXX:android:XXXXX</string>
<string name="google_crash_reporting_api_key">AIzaXXXXXXX</string>
<string name="project_id">XXXXXXX</string>

2
我很难匹配google-services.json文件中的哪个键的值匹配相应的等效字符串,但是后来我发现这有所帮助:developers.google.com/android/guides / ...如果其他人遇到相同的问题,请贴上它。
赛富尔·拉赫曼·莫辛

3

根据@ZakTaccardi的答案,并假设您不想同时使用这两种口味的项目,请将其添加到build.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。将风味名称替换为您使用的风味名称。


3

我发现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构建变体


@swimmingtomars您可能不必要地应用了google-service插件。如果使用此方法,则无法应用google-services插件。如果您需要此插件提供GCM以外的服务,请参见接受的答案。
kjones

3

更新:

关于带有构建变体的Firebase设置,请参阅此博客,其中有详细说明。


2

google-services插件的目的是简化Google功能的集成。

我认为,由于它仅从google-services.json文件生成android-resources,因此过于复杂的gradle-logic否定了这一点。

因此,如果Google文档未说明特定Google功能需要哪些资源,我建议为每个相关的构建类型/风味生成JSON文件,查看插件生成了哪些资源,然后手动放置这些资源。进入各自的src / buildtypeORflavor / res目录。

之后,删除对google-services插件和JSON文件的引用,即可完成操作。

有关google-services gradle-plugin内部工作原理的详细信息,请参阅我的其他答案:

https://stackoverflow.com/a/33083898/433421


我不明白如何使用您的答案,我可以包含2 google-service.json。1个用于调试,另一个用于发布
penduDev '16

2

简化@Scotti所说的。您需要根据产品的口味为特定项目创建具有不同程序包名称的Multiples应用程序。

假设您的项目是具有不同产品口味X,Y的ABC,其中X的软件包名称为com.x,Y的软件包名称为com.y,则需要在Firebase控制台中创建一个项目ABC,您需要在其中创建2个应用软件包名称为com.x和com.y。然后,您需要下载google-services.json文件,该文件中将有2个包含这些文件的client-info对象,您可以使用。

json的片段将是这样的

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

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

    }

2

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


2

因此,如果要以编程方式将google-services.json所有变体中的文件复制到根文件夹中。当您切换到特定版本时,这是您的解决方案

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

这种方法有一个警告,那就是您需要google-service.json在每个variants文件夹中都有文件,这是一个示例。变体图片


1

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

我很懒惰现在发布图片,但是基本上:

  • 转到https://developers.google.com/mobile/add
  • 选择平台
  • 选择你的应用
  • 重要提示:在“ android package name”字段中输入您的调味包名称
  • ...继续获取您的配置文件。下载它!

配置文件时,您可以看到Google向您显示了服务器API密钥+发件人ID。所有包装(调味料)都相同

最后,您只需要一个json文件即可使用所有样式。

这里还有一个问题,您必须在注册时进行测试才能获得注册令牌,并检查每种口味是否有所不同。我没有提及,但它认为应该有所不同。现在为时已晚,我很困:)希望能有所帮助!


1

嗨,朋友也只使用小写字母查找姓名,那么您不会收到此错误


0

我目前在同一应用包中使用两个GCM项目ID。我将第一个GCM项目的google-service.json放到了第一个GCM项目中,但我只更改了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

将您的“ google-services.json”文件分别放在app / src / flavors下,然后在app的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'
                    }
                }
            }
        }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.