Ich implementiere das neue Google Cloud Messaging gemäß den Anleitungen auf der Google Developers-Seite hier
Ich habe es erfolgreich ausgeführt und getestet. Mein Problem ist jetzt jedoch, dass ich unterschiedliche Produktvarianten mit unterschiedlichen Anwendungs-IDs / Paketnamen und unterschiedlichen Google Cloud Messaging-Projekt-IDs habe. Die google-services.json
müssen im /app/google-services.json
nicht den Flavours-Ordner abgelegt werden .
Gibt es eine Möglichkeit, die google-services.json
Konfiguration für viele Varianten anders zu gestalten?
apply plugin: 'com.google.gms.google-services'
in der Gradle-Datei scheintgcm
Zeichenfolgen inapp/build/generated/res/google-services/debug/values/values.xml
...Antworten:
Google hat die Unterstützung für Geschmacksrichtungen in Version 2.0 des Plugins für Spieledienste aufgenommen. Seit dieser Version der
gradle plugin com.google.gms:google-services:2.0.0-alpha3
du kannst das
Version 3.0.0 des Plugins sucht an diesen Speicherorten nach der JSON-Datei (
flavor
vorausgesetzt, Sie haben einen Flavour1- und einen Build-Typdebug
):Dies funktionierte bei mir sogar mit FlavourDimensions. Ich habe kostenlos und bezahlt in einer Dimension und Mock & Prod in der anderen Dimension. Ich habe auch 3 buildTypes: Debug, Release und Staging. So sieht es in meinem Projekt für die FreeProd-Variante aus:
Wie viele google-services.json-Dateien von den Eigenschaften Ihres Projekts abhängen, Sie benötigen jedoch mindestens eine json-Datei für jedes Google-Projekt.
Wenn Sie weitere Informationen darüber wünschen, was dieses Plugin mit diesen JSON-Dateien macht, finden Sie hier: https://github.com/googlesamples/google-services/issues/54#issuecomment-165824720
Link zu den offiziellen Dokumenten: https://developers.google.com/android/guides/google-services-plugin
Blog-Beitrag mit aktualisierten Informationen: https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html
Klicken Sie hier, um die neueste Version dieses Plugins zu überprüfen: https://bintray.com/android/android-tools/com.google.gms.google-services/view
quelle
File google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.
daher werde ich jedes Mal über ein Build-Skript die Flavour-Datei in den Stammordner kopieren.UPDATE: Die folgende Erklärung bezieht sich auf ein Android Studio-Projekt mit einem Firebase-Projekt und verschiedenen Firebase-Apps in diesem Projekt. Wenn das Ziel darin besteht, unterschiedliche JSON-Dateien für unterschiedliche Firebase-Apps in unterschiedlichen Firebase-Projekten innerhalb desselben Android Studio-Projekts zu haben (oder wenn Sie nicht wissen, was der Unterschied ist), klicken Sie hier. .
Sie benötigen eine Firebase-App pro Android-Anwendungs-ID (normalerweise Paketname). Es ist üblich, eine Anwendungs-ID pro Gradle-Build-Variante zu haben (dies ist wahrscheinlich, wenn Sie Gradle-Build-Typen und Gradle-Build-Varianten verwenden).
Ab Google Services 3.0 und unter Verwendung von Firebase ist es nicht erforderlich, unterschiedliche Dateien für unterschiedliche Varianten zu erstellen. Das Erstellen verschiedener Dateien für verschiedene Geschmacksrichtungen kann nicht klar oder unkompliziert sein, wenn Sie ProductFlavours- und Build-Typen haben, die miteinander komponieren.
In derselben Datei finden Sie alle Konfigurationen, die Sie für alle Build-Typen und -Varianten benötigen.
In der Firebase-Konsole müssen Sie eine App pro Paketnamen hinzufügen. Stellen Sie sich vor, Sie haben 2 Varianten (dev und live) und 2 Build-Typen (Debug und Release). Abhängig von Ihrer Konfiguration, aber es ist wahrscheinlich, dass Sie 4 verschiedene Paketnamen haben wie:
Sie benötigen 4 verschiedene Android Apps in der Firebase-Konsole. (Auf jedem müssen Sie den SHA-1 zum Debuggen hinzufügen und für jeden Computer, den Sie verwenden, live sein.)
Wenn Sie die Datei google-services.json herunterladen, spielt es eigentlich keine Rolle, von welcher App Sie sie herunterladen. Alle enthalten dieselben Informationen zu allen Ihren Apps.
Jetzt müssen Sie diese Datei auf App-Ebene (app /) suchen.
Wenn Sie diese Datei öffnen, sehen Sie, dass sie alle Informationen für alle Ihre Paketnamen enthält.
Ein Schmerzpunkt ist das Plugin. Damit es funktioniert, müssen Sie das Plugin am Ende Ihrer Datei suchen. Also diese Zeile ..
... muss sich am Ende Ihrer App build.gradle-Datei befinden.
Für die meisten der hier genannten gilt dies auch für frühere Versionen. Ich hatte noch nie verschiedene Dateien für verschiedene Konfigurationen, aber jetzt ist die Firebase-Konsole einfacher, da sie eine einzige Datei mit allem bietet, was Sie für alle Konfigurationen benötigen.
quelle
Schrieb einen mittleren Beitrag zu diesem Thema.
Hatte ein ähnliches Problem (mit BuildTypes anstelle von Flavours) und behebt es so.
Nutzen Sie das Abhängigkeitsmanagementsystem von Gradle. Ich habe zwei Aufgaben erstellt
switchToDebug
undswitchToRelease
. Erfordern, dass jede Zeit ausgeführtassembleRelease
wird, dieswitchToRelease
auch ausgeführt wird. Gleiches gilt für das Debuggen.BEARBEITEN: Verwenden Sie
processDebugFlavorGoogleServices
/processReleaseFlavorGoogleServices
task, um es auf Geschmacksebene zu ändern.quelle
Nun, ich habe das gleiche Problem und konnte keine perfekte Lösung finden. Es ist nur eine Problemumgehung. Ich frage mich, warum Google nicht über Aromen nachgedacht hat ...? Und ich hoffe, sie werden bald eine bessere Lösung vorschlagen.
Was mache ich:
Ich habe zwei Geschmacksrichtungen, in jede habe ich die entsprechende google-services.json eingefügt:
src/flavor1/google-services.json
undsrc/flavor2/google-services.json
.Dann kopiere ich in Build Gradle die Datei je nach Geschmack in das
app/
Verzeichnis:Einschränkung: Sie müssen die Gradle jedes Mal
myFlavor
manuell ändern, wenn Sie für einen anderen Geschmack ausführen möchten (da dieser fest codiert ist).Ich habe viele Möglichkeiten ausprobiert, um den aktuellen Build-Geschmack so
afterEvaluate
nah wie möglich zu bringen. Bis jetzt konnte ich keine bessere Lösung finden.Update, eine andere Lösung: eine google-services.json für alle Geschmacksrichtungen:
Sie können auch unterschiedliche Paketnamen für jede Variante verwenden und dann in der Google-Entwicklerkonsole nicht zwei verschiedene Apps für jede Variante erstellen, sondern nur zwei verschiedene Clients in derselben App. Dann haben Sie nur einen
google-services.json
, der Ihre beiden Clients enthält. Dies hängt natürlich davon ab, wie Sie das Backend Ihrer Aromen implementieren. Wenn sie nicht getrennt sind, hilft Ihnen diese Lösung nicht weiter.quelle
google-services.json
für beiderelease
unddebug
arbeitete für mich, wie in Ihrem Update erwähnt. Ich denke, dies ist die einfachste Lösung, wenn Sie nur versuchen, Ihrendebug
Build zu teilen , wie ich es bin. Als Referenz können Sie die Datei hier generieren: developer.google.com/mobile/add?platform=androidGemäß der Antwort von ahmed_khan_89 können Sie Ihren " Kopiercode " in Produktaromen einfügen.
Dann müssen Sie die Einstellungen nicht manuell ändern.
quelle
Ich verwende die Datei google-services.json, die von hier aus erstellt wurde: https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging % 2Fandroid% 2Fclient & cntlbl = Weiter% 20 Hinzufügen von% 20GCM% 20Support &% 3Fconfigured% 3Dtrue
In der JSON-Struktur gibt es ein JSON-Array namens Clients. Wenn Sie mehrere Geschmacksrichtungen haben, fügen Sie hier einfach die verschiedenen Eigenschaften hinzu.
In meinem Projekt verwende ich dieselbe Projekt-ID. Wenn ich den zweiten Paketnamen in die obige URL einfüge, stellt Google mir eine Datei zur Verfügung, die mehrere Clients in den JSON-Daten enthält.
Entschuldigung für die kompakten JSON-Daten. Ich konnte es nicht richtig formatieren lassen ...
quelle
Die Datei google-services.json ist nicht erforderlich, um Benachrichtigungen zu erhalten. Fügen Sie einfach eine Variable für jede Variante in Ihre build.gradle-Datei ein:
Verwenden Sie diese Variable BuildConfig.GCM_SENDER_ID anstelle von getString (R.string.gcm_defaultSenderId) bei der Registrierung:
quelle
1.) Was macht google-services.json wirklich?
Folgen Sie diesen Anweisungen : https://stackoverflow.com/a/31598587/2382964
2.) Wie wirkt sich die Datei google-services.json auf Ihr Android Studio-Projekt aus?
Folgen Sie diesen Anweisungen : https://stackoverflow.com/a/33083898/2382964
Kurz gesagt für die zweite URL: Wenn Sie in Ihrem Projekt google-services.json hinzufügen, muss in diesem Pfad ein automatisch generierter
google-services
Ordner für diedebug
Variante vorhanden sein3.) Was tun, um es zu erledigen?
project_level
Fügen Sie die Abhängigkeit von Google Services in build.gradle hinzu. Sie können diese auch verwenden,version 3.0.0
wenn Sie die Bibliothek app_compact verwenden.Jetzt in
app_level
build.gradle müssen Sie unten hinzufügen.4.) Wo soll die Datei google-service.json in Ihre Struktur eingefügt werden?
Fall 1.) Wenn Sie kein build_flavor haben, legen Sie es einfach in den
/app/google-service.json
Ordner.Fall 2.) Wenn Sie mehrere build_flavor-Dateien haben und unterschiedliche google_services.json-Dateien darin abgelegt haben
app/src/build_flavor/google-service.json
.Fall 3.) Wenn Sie mehrere build_flavor und eine einzelne google_services.json-Datei haben
app/google-service.json
.quelle
Kein zusätzliches Gradle-Scripting erforderlich.
Google hat begonnen, im Namen von 'android_client_info' einen anderen Paketnamen hinzuzufügen. Es sieht wie unten in google-services.json aus
Die folgenden Schritte reichen also aus, um eine andere Auswahl von google-services.json zu haben.
Das ist es!..
quelle
Wir haben einen anderen Paketnamen für Debug-Builds (* .debug), daher wollte ich etwas, das auf Flavour und BuildType basiert, ohne etwas Flavour-bezogenes in das Muster von schreiben zu müssen
processDebugFlavorGoogleServices
.Ich habe in jeder Version einen Ordner mit dem Namen "google-services" erstellt, der sowohl die Debug-Version als auch die Release-Version der JSON-Datei enthält:
Fügen Sie im Abschnitt buildTypes Ihrer Gradle-Datei Folgendes hinzu:
Die richtige JSON-Datei wird automatisch im Stammverzeichnis Ihres App-Moduls kopiert, wenn Sie die Build-Variante wechseln.
Fügen Sie die beiden aufgerufenen Methoden hinzu, um die aktuelle Version und den aktuellen Build-Typ im Stammverzeichnis Ihres build.gradle abzurufen
Das war's, Sie müssen sich keine Gedanken über das Entfernen / Hinzufügen / Ändern von Aromen aus Ihrer Gradle-Datei machen, und es wird automatisch das Debug oder die Veröffentlichung google-services.json abgerufen.
quelle
Firebase unterstützt jetzt mehrere Anwendungs-IDs mit einer Datei google-services.json.
Dieser Blog-Beitrag beschreibt es im Detail.
Sie erstellen ein übergeordnetes Projekt in Firebase, das Sie für alle Ihre Varianten verwenden. Anschließend erstellen Sie in Firebase unter diesem Projekt separate Android-Anwendungen für jede Anwendungs-ID, die Sie haben.
Wenn Sie alle Ihre Varianten erstellt haben, können Sie eine google-services.json herunterladen, die alle Ihre Anwendungs-IDs unterstützt. Wenn es relevant ist, die Daten separat anzuzeigen (z. B. Crash Reporting), können Sie dies mit einem Dropdown-Menü umschalten.
quelle
Laut Firebase-Dokumenten können Sie anstelle von google-services.json auch Zeichenfolgenressourcen verwenden .
Beispiel
strings.xml
:quelle
Fügen Sie dies basierend auf der Antwort von @ ZakTaccardi und unter der Annahme, dass Sie kein einziges Projekt für beide Varianten wünschen, am Ende Ihrer
build.gradle
Datei hinzu:Sie müssen die Dateien
src/staging/google-services.json
und habensrc/production/google-services.json
. Ersetzen Sie die Geschmacksnamen durch die von Ihnen verwendeten.quelle
Ich habe festgestellt, dass das Google Services- Plugin für Projekte, die GCM hinzufügen möchten, ziemlich nutzlos ist. Es wird nur die folgende Datei generiert, die einfach Ihre Projekt-ID als Zeichenfolgenressource hinzufügt:
Es scheint, dass Sie es nur benötigen, wenn Sie den Beispielcode wörtlich direkt aus dem Cloud Messaging für Android- Handbuch kopiert haben . Hier ist die Beispielzeile:
Lösung
Wenn Sie API-Projekte für verschiedene Build-Typen oder Produktvarianten wechseln möchten, können Sie einfach Ihre eigenen Konstanten definieren und beim Aufrufen der
getToken()
API die entsprechende auswählen .Für Produktaromen
Der obige Code funktioniert zum Umschalten zwischen Debug- und Release-Builds. Für Produktvarianten definieren Sie verschiedene API-Schlüssel in einer Java-Quelldatei und platzieren die Dateien in ihrem entsprechenden Produktvariantenverzeichnis. Als Referenz: Gradle Build-Varianten
quelle
AKTUALISIERT:
Informationen zum Firebase-Setup mit Build-Varianten finden Sie in diesem Blog mit detaillierten Anweisungen.
quelle
Mit dem Google Services-Plugin soll die Integration von Google-Funktionen vereinfacht werden.
Da es nur Android-Ressourcen aus der Datei google-services.json generiert, negiert eine überkomplizierte Gradle-Logik diesen Punkt, denke ich.
Wenn in den Google-Dokumenten nicht angegeben ist, welche Ressourcen für bestimmte Google-Funktionen benötigt werden, würde ich vorschlagen, die JSON-Datei für jeden relevanten Buildtyp / jede relevante Version zu generieren, zu sehen, welche Ressourcen vom Plugin generiert werden, und diese Ressourcen dann manuell zu platzieren in ihre jeweiligen Verzeichnisse src / buildtypeORflavor / res.
Löschen Sie danach die Verweise auf das Google Services-Plugin und die JSON-Datei, und Sie sind fertig.
Für detaillierte Informationen über das Innenleben von Google-Services Gradle-Plugin siehe meine andere Antwort:
https://stackoverflow.com/a/33083898/433421
quelle
Vereinfachen, was @Scotti gesagt hat. Sie müssen mehrere Apps mit unterschiedlichen Paketnamen für ein bestimmtes Projekt erstellen, abhängig von der Produktvariante.
Angenommen, Ihr Projekt ist ABC mit unterschiedlichen Produktvarianten X, Y, wobei X den Paketnamen com.x und Y den Paketnamen com.y hat. Dann müssen Sie in der Firebase-Konsole ein Projekt ABC erstellen, in dem Sie 2 Apps erstellen müssen mit den Paketnamen com.x und com.y. Dann müssen Sie die Datei google-services.json herunterladen, in der sich 2 Client-Info-Objekte befinden, die diese Pakete enthalten, und Sie können loslegen.
Ein Ausschnitt aus dem Json wäre so etwas
quelle
In der Tat ist juste one google-services.json im
MyApp/app/
Verzeichnis gut, es ist kein zusätzliches Skript erforderlichcom.google.gms:google-services:3.0.0
. Achten Sie jedoch darauf, die Dateigoogle-services.json
aus dem App-VerzeichnisMyApp/app/src/flavor1/res/
zu löschen , um den Fehlertyp zu vermeidenExecution failed for task ':app:processDebugGoogleServices'. > No matching client found for package
quelle
Wenn Sie also programmgesteuert
google-services.json
Dateien aus all Ihren Varianten in Ihren Stammordner kopieren möchten . Wenn Sie zu einer bestimmten Variante wechseln, finden Sie hier eine Lösung für SieEs gibt eine Einschränkung bei diesem Ansatz, dass Sie eine
google-service.json
Datei in jedem Ihrer Variantenordner haben müssen. Hier ist ein Beispiel.quelle
Sie haben viele Geschmacksrichtungen, was bedeutet, dass Sie viele unterschiedliche Paket-IDs haben, oder? Gehen Sie einfach zu der Seite, auf der Sie Ihre JSON-Datei einrichten / generieren und für jeden Paketnamen konfigurieren. Alles wird zur JSON-Datei hinzugefügt.
Ich bin sehr faul, jetzt ein Bild zu posten, aber im Grunde genommen:
Wenn Sie die Datei konfigurieren, sehen Sie, dass Google Ihnen den Server-API-Schlüssel + die Absender-ID anzeigt. Und es ist für alle Packungen (Geschmacksrichtungen) gleich
Am Ende benötigen Sie nur eine JSON-Datei für alle Geschmacksrichtungen.
Eine weitere Frage, die Sie testen müssen, wenn Sie sich registrieren, um das Registrierungstoken zu erhalten. Überprüfen Sie, ob es für jeden Geschmack einen Unterschied gibt. Ich rühre es nicht an, aber ich denke, es sollte ein Unterschied sein. Jetzt zu spät und ich bin so müde :) Hoffe es hilft!
quelle
Hey Freunde sucht auch nach Namen nur in Kleinbuchstaben, dann bekommst du diesen Fehler nicht
quelle
Ich verwende derzeit zwei GCM-Projekt-IDs im selben App-Paket. Ich habe die google-service.json meines ersten GCM-Projekts eingefügt, aber ich wechsle von der ersten zur zweiten und ändere nur die SENDER_ID:
(An dieser Stelle denke ich, dass die Datei google-services.json nicht obligatorisch ist)
quelle
Inspiriert von der Antwort von @ ahmed_khan_89 oben. Wir können so direkt in Gradle-Datei behalten.
quelle
Platzieren Sie Ihre "google-services.json" -Datei unter app / src / flavours bzw. dann in build.gradle der App unter android add unten code
quelle