Wdrażam nowy Google Cloud Messaging, postępując zgodnie ze wskazówkami ze strony Google Developers tutaj
Udało mi się to uruchomić i przetestować. Ale moim problemem jest teraz to, że mam różne smaki produktów z różnymi identyfikatorami aplikacji / nazwa_pakietu i innym identyfikatorem projektu Google Cloud Messaging. Trzeba google-services.json
je umieścić w /app/google-services.json
folderze nie smaki.
Czy jest jakiś sposób, aby zmienić google-services.json
konfigurację dla wielu smaków?
apply plugin: 'com.google.gms.google-services'
w pliku gradle wydaje się wstawiaćgcm
ciągi doapp/build/generated/res/google-services/debug/values/values.xml
...Odpowiedzi:
Google zawarło obsługę smaków w wersji 2.0 wtyczki usług Play. Od tej wersji
gradle plugin com.google.gms:google-services:2.0.0-alpha3
możesz to zrobić
Wersja 3.0.0 wtyczki wyszukuje plik json w tych lokalizacjach (biorąc pod uwagę, że masz
flavor
wersję flav1 i typ kompilacjidebug
):To działało dla mnie nawet przy użyciu flavourDimensions. Mam darmowy i płatny w jednym wymiarze, a Mock & Prod w drugim wymiarze. Mam również 3 typy buildów: debugowanie, wydanie i inscenizacja. Tak to wygląda w moim projekcie dla smaku FreeProd:
Ile plików google-services.json będzie zależeć od cech twojego projektu, ale będziesz potrzebował co najmniej jednego pliku json dla każdego projektu Google.
Jeśli chcesz uzyskać więcej informacji o tym, co ta wtyczka robi z tymi plikami json, oto: https://github.com/googlesamples/google-services/issues/54#issuecomment-165824720
Link do oficjalnych dokumentów: https://developers.google.com/android/guides/google-services-plugin
Wpis na blogu ze zaktualizowanymi informacjami: https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html
I przejdź tutaj, aby sprawdzić najnowszą wersję tej wtyczki: https://bintray.com/android/android-tools/com.google.gms.google-services/view
źródło
File google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.
dlatego za każdym razem będę musiał kopiować plik smakowy do folderu głównego za pomocą skryptu kompilacji.AKTUALIZACJA: Poniższe objaśnienie dotyczy jednego projektu Android Studio z jednym projektem Firebase i różnymi aplikacjami Firebase w tym projekcie. Jeśli celem jest posiadanie różnych plików JSON dla różnych aplikacji Firebase w różnych projektach Firebase w ramach tego samego projektu Android Studio (lub jeśli nie wiesz, jaka jest różnica), spójrz tutaj. .
Potrzebujesz jednej aplikacji Firebase na identyfikator aplikacji na Androida (zwykle nazwa pakietu). Często występuje jeden identyfikator aplikacji dla każdego wariantu kompilacji Gradle (jest to prawdopodobne, jeśli użyjesz typów kompilacji Gradle i smaków kompilacji Gradle)
Począwszy od usług Google 3.0 i korzystania z Firebase , nie trzeba tworzyć różnych plików dla różnych smaków. Tworzenie różnych plików dla różnych smaków może być niejasne lub proste, jeśli masz komponenty ProductFlavours i Build, które się ze sobą komponują.
W tym samym pliku będziesz mieć wszystkie konfiguracje, których potrzebujesz dla wszystkich typów kompilacji i smaków.
W konsoli Firebase musisz dodać jedną aplikację na nazwę pakietu. Wyobraź sobie, że masz 2 smaki (dev i live) i 2 typy kompilacji (debugowanie i wydanie). W zależności od konfiguracji, ale prawdopodobnie masz 4 różne nazwy pakietów, takie jak:
Potrzebujesz 4 różnych aplikacji na Androida w konsoli Firebase. (Na każdym z nich musisz dodać SHA-1 do debugowania i na żywo dla każdego komputera, którego używasz)
Gdy pobierasz plik google-services.json, tak naprawdę nie ma znaczenia, z której aplikacji go pobierzesz, wszystkie zawierają te same informacje związane ze wszystkimi Twoimi aplikacjami.
Teraz musisz zlokalizować ten plik na poziomie aplikacji (app /).
Jeśli otworzysz ten plik, zobaczysz, że jeśli zawiera wszystkie informacje o wszystkich nazwach pakietów.
Punktem bólu jest wtyczka. Aby go uruchomić, musisz zlokalizować wtyczkę na dole pliku. Więc ta linia ...
... musi znajdować się na dole pliku build.gradle aplikacji.
W przypadku większości wspomnianych tutaj dotyczy to również poprzednich wersji. Nigdy nie miałem różnych plików dla różnych konfiguracji, ale teraz konsola Firebase jest łatwiejsza, ponieważ zapewniają one jeden plik ze wszystkim, czego potrzebujesz do wszystkich konfiguracji.
źródło
Napisałem średni post na ten temat.
Miałem podobny problem (używanie BuildTypes zamiast Flavours) i tak go naprawiłem.
Skorzystaj z systemu zarządzania zależnościami firmy Gradle. Stworzyłem dwa zadania
switchToDebug
iswitchToRelease
. Wymagaj, aby w dowolnym momencieassembleRelease
było uruchamiane, toswitchToRelease
jest również uruchamiane. To samo dotyczy debugowania.EDYCJA: użyj
processDebugFlavorGoogleServices
/processReleaseFlavorGoogleServices
task, aby zmodyfikować go na poziomie dla każdego smaku.źródło
Cóż, mam ten sam problem i nie mogłem znaleźć żadnego idealnego rozwiązania. To tylko obejście. Zastanawiam się, jak Google nie pomyślał o smakach ...? I mam nadzieję, że wkrótce zaproponują lepsze rozwiązanie.
Co ja robię:
Mam dwa smaki, w każdym z nich umieszczam odpowiedni plik google-services.json:
src/flavor1/google-services.json
isrc/flavor2/google-services.json
.Następnie w gradacji kompilacji kopiuję plik w zależności od smaku do
app/
katalogu:Ograniczenie: będziesz musiał zmieniać
myFlavor
ręcznie za każdym razem, gdy chcesz uruchomić inny smak (ponieważ jest zakodowany na stałe).Próbowałem wielu sposobów, aby uzyskać obecny smak kompilacji, jak
afterEvaluate
blisko ... nie mogłem znaleźć lepszego rozwiązania do tej pory.Aktualizacja, inne rozwiązanie: jeden plik google-services.json dla wszystkich smaków:
Możesz również mieć różne nazwy pakietów dla każdego smaku, a następnie w konsoli programisty Google nie musisz tworzyć dwóch różnych aplikacji dla każdego smaku, a tylko dwóch różnych klientów w tej samej aplikacji. Będziesz miał tylko jeden,
google-services.json
który zawiera obu twoich klientów. Oczywiście zależy to od tego, jak implementujesz backend swoich smaków. Jeśli nie zostaną rozdzielone, to rozwiązanie ci nie pomoże.źródło
google-services.json
dla oburelease
idebug
działa dla mnie, jak wspomniano w twojej aktualizacji. Myślę, że jest to najprostsze rozwiązanie, jeśli próbujesz podzielić swojądebug
wersję, tak jak ja. WZgodnie z odpowiedzią ahmed_khan_89 możesz umieścić „kopiuj kod” w smaku produktu.
Wówczas nie musisz ręcznie zmieniać ustawień.
źródło
Korzystam z pliku google-services.json, utworzonego tutaj: https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging % 2Fandroid% 2Fclient & cntlbl = Kontynuuj% 20Dodawanie% 20GCM% 20 Wsparcie i% 3Fconfigured% 3Dtrue
W strukturze JSON znajduje się tablica JSON zwana klientami. Jeśli masz wiele smaków, po prostu dodaj tutaj różne właściwości.
W moim projekcie korzystam z tego samego identyfikatora projektu, a gdy dodam drugą nazwę pakietu w powyższym adresie URL, Google udostępnia mi plik zawierający wielu klientów w danych json.
Przepraszamy za kompaktowe dane JSON. Nie mogłem poprawnie sformatować ...
źródło
Plik google-services.json nie jest potrzebny do otrzymywania powiadomień. Po prostu dodaj zmienną dla każdego smaku w pliku build.gradle:
Użyj tej zmiennej BuildConfig.GCM_SENDER_ID zamiast getString (R.string.gcm_defaultSenderId) podczas rejestracji:
źródło
1.) Co naprawdę robi google-services.json?
Postępuj zgodnie z tym: https://stackoverflow.com/a/31598587/2382964
2.) W jaki sposób plik google-services.json wpływa na projekt Android Studio?
Postępuj zgodnie z tym: https://stackoverflow.com/a/33083898/2382964
krótko po drugim adresie URL, jeśli dodasz google-services.json w swoim projekcie, musi istnieć automatycznie wygenerowany
google-services
folder dladebug
wariantu na tej ścieżce3.) Co zrobić, aby to zrobić?
dodaj zależność usług Google w
project_level
build.gradle, możesz także użyć,version 3.0.0
jeśli korzystasz z biblioteki app_compact.teraz w
app_level
build.gradle musisz dodać na dole.4.) Gdzie umieścić plik google-service.json w swojej strukturze.
przypadek 1.) jeśli nie masz wersji build_flavor, po prostu włóż ją do
/app/google-service.json
folderu.przypadek 2.) jeśli masz wiele wersji build_flavor i masz w nim różne pliki google_services.json
app/src/build_flavor/google-service.json
.przypadek 3.) jeśli masz wiele wersji build_flavor i masz w sobie pojedynczy plik google_services.json
app/google-service.json
.źródło
Nie ma potrzeby wykonywania dodatkowych skryptów.
Google zaczął dodawać inną nazwę pakietu w nazwie „android_client_info”. Wygląda jak poniżej w google-services.json
więc następujące kroki wystarczą, aby wybrać inny wybór google-services.json.
To jest to!..
źródło
Mamy inną nazwę pakietu dla kompilacji debugowania (* .debug), więc chciałem czegoś, co działa w oparciu o flavour i buildType, bez konieczności pisania we wzorcu czegoś związanego ze smakiem
processDebugFlavorGoogleServices
.W każdym smaku utworzyłem folder o nazwie „usługi Google”, zawierający zarówno wersję debugowania, jak i wersję wydania pliku json:
W sekcji buildTypes pliku ocen dodaj:
Skopiuje odpowiedni plik json w katalogu głównym modułu aplikacji automatycznie po zmianie wariantu kompilacji.
Dodaj dwie metody wywoływane, aby uzyskać bieżący smak i bieżący typ kompilacji w katalogu głównym pliku build.gradle
To wszystko, nie musisz się martwić usunięciem / dodaniem / modyfikacją smaków z pliku gradle, a automatycznie otrzyma debugowanie lub wydanie google-services.json.
źródło
Firebase obsługuje teraz wiele identyfikatorów aplikacji za pomocą jednego pliku google-services.json.
Ten post na blogu szczegółowo to opisuje.
W Firebase stworzysz jeden projekt nadrzędny, którego będziesz używać dla wszystkich swoich wariantów. Następnie tworzysz osobne aplikacje na Androida w Firebase w ramach tego projektu dla każdego posiadanego identyfikatora aplikacji.
Po utworzeniu wszystkich wariantów możesz pobrać plik google-services.json, który obsługuje wszystkie identyfikatory aplikacji. Gdy istotne jest oddzielne wyświetlanie danych (tj. Raportowanie awarii), możesz przełączać je za pomocą menu rozwijanego.
źródło
Zgodnie z dokumentami Firebase zamiast google-services.json możesz również używać zasobów łańcuchowych .
Przykład
strings.xml
:źródło
W oparciu o odpowiedź @ ZakTaccardi i zakładając, że nie chcesz jednego projektu dla obu smaków, dodaj to na końcu
build.gradle
pliku:Musisz mieć pliki
src/staging/google-services.json
isrc/production/google-services.json
. Zamień nazwy smaków na te, których używasz.źródło
Odkryłem, że wtyczka usług Google jest dość bezużyteczna dla projektów, które chcą dodać GCM. Generuje tylko następujący plik, który po prostu dodaje identyfikator projektu jako zasób łańcucha:
Wygląda na to, że potrzebujesz go tylko wtedy, gdy skopiowałeś przykładowy kod dosłownie bezpośrednio z przewodnika Cloud Messaging na Androida . Oto przykładowa linia:
Rozwiązanie
Jeśli chcesz mieć możliwość przełączania projektów API dla różnych typów kompilacji lub smaków produktów, możesz po prostu zdefiniować własne stałe i wybrać odpowiedni podczas wywoływania
getToken()
API.Do smaków produktu
Powyższy kod działa przy przełączaniu między kompilacjami debugowania i wydania. W przypadku smaków produktu należy zdefiniować różne klucze API w pliku źródłowym Java i umieścić pliki w odpowiednim katalogu smaków produktu. Dla odniesienia: warianty kompilacji stopniowej
źródło
AKTUALIZACJA:
Jeśli chodzi o konfigurację Firebase z wariantami kompilacji, zapoznaj się z tym blogiem, który zawiera szczegółowe instrukcje.
źródło
Celem wtyczki usług Google jest uproszczenie integracji funkcji Google.
Ponieważ generuje tylko zasoby Androida z pliku google-services.json, myślę, że zbyt skomplikowana logika gradle neguje ten punkt.
Jeśli więc dokumenty Google nie mówią, które zasoby są potrzebne do określonych funkcji Google, sugerowałbym wygenerowanie pliku JSON dla każdego odpowiedniego typu / smaku, zobaczyć, jakie zasoby są generowane przez wtyczkę, a następnie ręcznie umieścić te zasoby do odpowiednich katalogów src / buildtypeORflavor / res.
Usuń odwołania do wtyczki usług Google i pliku JSON i gotowe.
Aby uzyskać szczegółowe informacje na temat wewnętrznego działania wtyczki stopni Google-Services, zobacz moją inną odpowiedź:
https://stackoverflow.com/a/33083898/433421
źródło
Uproszczenie tego, co powiedział @Scotti. Musisz utworzyć wiele aplikacji o różnych nazwach pakietów dla konkretnego projektu, w zależności od smaku produktu.
Załóżmy, że Twój projekt ma różne wersje produktu X, Y, gdzie X ma nazwę pakietu com.x, a Y ma nazwę pakietu com.y, a następnie w konsoli firebase musisz utworzyć projekt ABC, w którym musisz utworzyć 2 aplikacje z nazwami pakietów com.x i com.y. Następnie musisz pobrać plik google-services.json, w którym będą 2 obiekty informacji o kliencie, które będą zawierały te pacakges, i będziesz gotowy.
Fragment JSON byłby mniej więcej taki
źródło
Rzeczywiście, tylko jeden plik google-services.json w
MyApp/app/
katalogu jest dobry, nie wymaga dodatkowego skryptu zcom.google.gms:google-services:3.0.0
. Ale uważaj, aby usunąć plikgoogle-services.json
z katalogu aplikacji,MyApp/app/src/flavor1/res/
aby uniknąć błęduExecution failed for task ':app:processDebugGoogleServices'. > No matching client found for package
źródło
Więc jeśli chcesz programowo skopiować
google-services.json
plik ze wszystkich wariantów do folderu głównego. Po przejściu na konkretny wariant znajdziesz rozwiązanie dla CiebieJest to zastrzeżenie, że musisz mieć
google-service.json
plik w każdym folderze wariantów. Oto przykład.źródło
Masz wiele smaków, więc oznacza to, że będziesz mieć wiele różnych pakietów identyfikacyjnych, prawda? Więc po prostu przejdź do strony, na której konfigurujesz / generujesz plik json i konfigurujesz dla każdej nazwy pakietu. Wszystko to zostanie dodane do pliku json.
Jestem bardzo leniwy, aby opublikować zdjęcie, ale w zasadzie:
Podczas konfigurowania pliku widać, że Google pokazuje klucz API serwera + identyfikator nadawcy. I to samo dla wszystkich opakowań (smaków)
Na koniec potrzebujesz tylko jednego pliku json dla wszystkich smaków.
Jeszcze jedno pytanie, które musisz sprawdzić podczas rejestracji, aby otrzymać token rejestracyjny, sprawdź, czy jest różnica dla każdego smaku. Nie dotykam tego, ale myślę, że powinna to być różnica. Za późno i jestem bardzo śpiący :) Mam nadzieję, że to pomoże!
źródło
Hej, przyjaciele szukają również nazwy używanej tylko małymi literami, więc nie pojawia się ten błąd
źródło
Obecnie używam dwóch identyfikatorów projektu GCM w tym samym pakiecie aplikacji. Umieszczam plik google-service.json mojego pierwszego projektu GCM, ale przełączam się z pierwszego na drugi, zmieniając tylko SENDER_ID:
(W tym momencie myślę, że plik google-services.json nie jest obowiązkowy)
źródło
Zainspirowany powyższą odpowiedzią @ ahmed_khan_89. Możemy tak bezpośrednio przechowywać w pliku gradle.
źródło
Umieść plik „google-services.json” odpowiednio w app / src / flavours, a następnie w build.gradle aplikacji, pod Android dodaj poniższy kod
źródło