Estoy implementando el nuevo Google Cloud Messaging siguiendo las guías de la página Google Developers aquí.
Lo ejecuté y probé con éxito. Pero mi problema ahora es que tengo diferentes sabores de productos con diferentes applicationId / packageName y diferentes ID de proyecto de Google Cloud Messaging. El google-services.json
tiene que ser puesto en el /app/google-services.json
no a la carpeta sabores.
¿Hay alguna manera de hacer que la google-services.json
configuración sea diferente para muchos sabores?
apply plugin: 'com.google.gms.google-services'
en el archivo gradle parece ponergcm
cadenas enapp/build/generated/res/google-services/debug/values/values.xml
...Respuestas:
Google incluyó soporte para sabores en la versión 2.0 del complemento de servicios de reproducción. Desde esta versión de la
gradle plugin com.google.gms:google-services:2.0.0-alpha3
Puedes hacerlo
La versión 3.0.0 del complemento busca el archivo json en estas ubicaciones (teniendo en cuenta que tiene un
flavor
sabor1 y un tipo de compilacióndebug
):Esto funcionó para mí incluso usando saborDimensiones. Tengo gratis y pago en una dimensión y Mock & Prod en la otra dimensión. También tengo 3 buildTypes: depuración, lanzamiento y puesta en escena. Así es como se ve en mi proyecto para el sabor FreeProd:
La cantidad de archivos google-services.json dependerá de las características de su proyecto, pero necesitará al menos un archivo json para cada proyecto de Google.
Si desea obtener más detalles sobre lo que hace este complemento con estos archivos json, aquí está: https://github.com/googlesamples/google-services/issues/54#issuecomment-165824720
Enlace a los documentos oficiales: https://developers.google.com/android/guides/google-services-plugin
Publicación de blog con información actualizada: https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html
Y vaya aquí para consultar la última versión de este complemento: https://bintray.com/android/android-tools/com.google.gms.google-services/view
fuente
File google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.
así que recurriré a copiar el archivo de sabor en la carpeta raíz cada vez a través de un script de compilación.ACTUALIZACIÓN: La siguiente explicación es para un proyecto de Android Studio, con un proyecto de Firebase y diferentes aplicaciones de Firebase dentro de ese proyecto. Si el objetivo es tener diferentes archivos JSON para diferentes aplicaciones de Firebase en diferentes proyectos de Firebase dentro del mismo proyecto de Android Studio, (o si no sabes cuál es la diferencia) mira aquí. .
Necesita una aplicación Firebase por ID de aplicación de Android (generalmente, nombre del paquete). Es común tener una ID de aplicación por variante de compilación de Gradle (esto será probable si usa tipos de compilación de Gradle y sabores de compilación de Gradle)
A partir de Google Services 3.0 y el uso de Firebase , no es necesario crear diferentes archivos para diferentes sabores. La creación de diferentes archivos para diferentes sabores no puede ser clara o sencilla en caso de que tenga tipos de Productos y Compilaciones que se compongan entre sí.
En el mismo archivo, tendrá todas las configuraciones que necesita para todos sus tipos de compilación y sabores.
En la consola de Firebase, debe agregar una aplicación por nombre de paquete. Imagine que tiene 2 sabores (dev y live) y 2 tipos de compilación (depuración y lanzamiento). Dependiendo de su configuración, pero es probable que tenga 4 nombres de paquete diferentes como:
Necesitas 4 aplicaciones de Android diferentes en Firebase Console. (En cada uno debe agregar el SHA-1 para depurar y en vivo para cada computadora que esté usando)
Cuando descarga el archivo google-services.json, en realidad no importa desde qué aplicación lo descargue, todos ellos contienen la misma información relacionada con todas sus aplicaciones.
Ahora necesita ubicar este archivo en el nivel de aplicación (app /).
Si abre ese archivo, verá que contiene toda la información para todos los nombres de sus paquetes.
Un punto de dolor solía ser el complemento. Para que funcione, debe ubicar el complemento en la parte inferior de su archivo. Entonces esta línea ...
... debe estar en la parte inferior del archivo build.gradle de su aplicación.
Para la mayoría de lo dicho aquí, se aplica también a versiones anteriores. Nunca he tenido diferentes archivos para diferentes configuraciones, pero ahora con la consola Firebase es más fácil porque proporcionan un solo archivo con todo lo que necesita para todas sus configuraciones.
fuente
Escribió una publicación mediana sobre este tema.
Tuve un problema similar (usando BuildTypes en lugar de Flavours), y lo solucioné así.
Aproveche el sistema de gestión de dependencias de Gradle. Creé dos tareas,
switchToDebug
yswitchToRelease
. Exigir queassembleRelease
se ejecute cualquier momento , queswitchToRelease
también se ejecuta. Lo mismo para la depuración.EDITAR: use
processDebugFlavorGoogleServices
/processReleaseFlavorGoogleServices
task para modificarlo a un nivel por sabor.fuente
Bueno, me encuentro con el mismo problema y no pude encontrar ninguna solución perfecta. Es solo una solución alternativa. Me pregunto cómo Google no pensó en los sabores ... Y espero que propongan pronto una mejor solución.
Qué estoy haciendo:
Tengo dos sabores, en cada uno pongo el correspondiente google-services.json:
src/flavor1/google-services.json
ysrc/flavor2/google-services.json
.Luego, en build gradle, copio el archivo dependiendo del sabor al
app/
directorio:Limitación: tendrá que cambiar
myFlavor
manualmente en gradle cada vez que desee ejecutar un sabor diferente (porque está codificado).Intenté muchas formas de obtener el sabor de construcción actual como
afterEvaluate
cercano ... no podría haber una mejor solución hasta ahora.Actualización, otra solución: un google-services.json para todos los sabores:
También puede tener diferentes nombres de paquetes para cada sabor y luego, en la consola de desarrolladores de Google , no tiene que crear dos aplicaciones diferentes para cada sabor, sino solo dos clientes diferentes en la misma aplicación. Entonces solo tendrá uno
google-services.json
que contenga a sus dos clientes. Por supuesto, esto depende de cómo esté implementando el backend de sus sabores. Si no están separados, esta solución no lo ayudará.fuente
google-services.json
para ambosrelease
ydebug
funcionó para mí, como se menciona en su actualización. Creo que esta es la solución más simple si solo está tratando de dividir sudebug
compilación, como yo. Como referencia, puede generar el archivo aquí: developers.google.com/mobile/add?platform=androidDe acuerdo con la respuesta de ahmed_khan_89 , puede ponerle un "código de copia" dentro de los sabores de productos.
Entonces no tiene que cambiar la configuración manualmente.
fuente
Estoy usando el archivo google-services.json, creado desde aquí: https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging % 2Fandroid% 2Fclient & cntlbl = Continuar% 20Adición% 20GCM% 20Support &% 3Fconfigured% 3Dtrue
En la estructura JSON hay una matriz JSON llamada clientes. Si tiene múltiples sabores, simplemente agregue las diferentes propiedades aquí.
En mi proyecto estoy usando el mismo ID de proyecto y cuando agrego el segundo nombre de paquete en la url anterior, google me proporciona un archivo que contiene varios clientes en los datos json.
Perdón por los datos JSON compactos. No pude formatearlo correctamente ...
fuente
El archivo google-services.json no es necesario para recibir notificaciones. Simplemente agregue una variable para cada sabor en su archivo build.gradle:
Use esta variable BuildConfig.GCM_SENDER_ID en lugar de getString (R.string.gcm_defaultSenderId) mientras se registra:
fuente
1.) ¿Qué hace realmente google-services.json?
Siga esto: https://stackoverflow.com/a/31598587/2382964
2.) ¿Cómo afecta el archivo google-services.json a su proyecto de estudio de Android?
Siga esto: https://stackoverflow.com/a/33083898/2382964
para abreviar la segunda url, si agrega google-services.json en su proyecto, debe haber una
google-services
carpeta autogenerada para ladebug
variante en esta ruta3.) ¿Qué hacer para hacerlo?
agregue la dependencia de google-services en
project_level
build.gradle, también puede usarversion 3.0.0
si está usando la biblioteca app_compact.ahora en
app_level
build.gradle tienes que agregar en la parte inferior.4.) Dónde colocar el archivo google-service.json en su estructura.
caso 1.) si no tiene build_flavor simplemente colóquelo dentro de la
/app/google-service.json
carpeta.caso 2.) si tiene múltiples build_flavor y tiene diferentes archivos google_services.json dentro
app/src/build_flavor/google-service.json
.caso 3.) si tiene múltiples build_flavor y tiene un solo archivo google_services.json puesto dentro
app/google-service.json
.fuente
No es necesario ningún script de gradle adicional.
Google comenzó a agregar un nombre de paquete diferente en el nombre de 'android_client_info'. Se ve a continuación en google-services.json
entonces, los siguientes pasos son suficientes para tener una selección diferente de google-services.json.
¡Eso es!..
fuente
Tenemos un nombre de paquete diferente para las compilaciones de depuración (* .debug), por lo que quería algo que funcione en función del sabor y el tipo de compilación, sin tener que escribir nada relacionado con el sabor en el patrón de
processDebugFlavorGoogleServices
.Creé una carpeta llamada "google-services" en cada versión, que contiene tanto la versión de depuración como la versión de lanzamiento del archivo json:
En la sección buildTypes de su archivo gradle, agregue esto:
Copiará el archivo json correcto en la raíz del módulo de su aplicación automáticamente cuando cambie la variante de compilación.
Agregue los dos métodos llamados para obtener el sabor actual y el tipo de compilación actual en la raíz de su build.gradle
Eso es todo, no tiene que preocuparse por eliminar / agregar / modificar sabores de su archivo gradle, y obtiene la depuración o el lanzamiento google-services.json automáticamente.
fuente
Firebase ahora admite múltiples ID de aplicaciones con un archivo google-services.json.
Esta entrada de blog describe en detalle.
Creará un proyecto principal en Firebase que usará para todas sus variantes. Luego, crea aplicaciones de Android separadas en Firebase en ese proyecto para cada ID de aplicación que tenga.
Cuando creó todas sus variantes, puede descargar un google-services.json que admite todos los identificadores de sus aplicaciones. Cuando es relevante ver los datos por separado (es decir, Informes de bloqueo), puede alternar eso con un menú desplegable.
fuente
Según los documentos de Firebase , también puedes usar recursos de cadena en lugar de google-services.json .
Ejemplo
strings.xml
:fuente
Según la respuesta de @ ZakTaccardi, y suponiendo que no desea un solo proyecto para ambos sabores, agregue esto al final de su
build.gradle
archivo:Necesitas tener los archivos
src/staging/google-services.json
ysrc/production/google-services.json
. Reemplace los nombres de sabor por los que usa.fuente
He descubierto que el complemento de servicios de google es bastante inútil para proyectos que desean agregar GCM. Solo genera el siguiente archivo que simplemente agrega su ID de proyecto como un recurso de cadena:
Parece que solo lo necesita si copió el código de muestra literalmente directamente de la guía de Cloud Messaging para Android . Aquí está la línea de ejemplo:
Solución
Si desea poder cambiar los proyectos de API para diferentes tipos de compilación o sabores de productos, puede definir sus propias constantes y elegir la apropiada al llamar a la
getToken()
API.Para sabores de productos
El código anterior funciona para cambiar entre depuración y versiones de lanzamiento. Para los sabores de productos, definiría diferentes claves API en un archivo fuente de Java y colocaría los archivos en su directorio de sabores de productos correspondiente. Para referencia: Variantes de construcción de Gradle
fuente
ACTUALIZADO:
En cuanto a la configuración de Firebase con variantes de compilación, consulte este blog que tiene instrucciones detalladas.
fuente
El objetivo del complemento de servicios de google es simplificar la integración de las funciones de Google.
Como solo genera recursos de Android a partir del archivo google-services.json, la lógica de gradle demasiado complicada niega este punto, creo.
Entonces, si los documentos de Google no dicen qué recursos son necesarios para funciones específicas de Google, sugeriría generar el archivo JSON para cada tipo de compilación / sabor relevante, ver qué recursos genera el complemento y luego poner esos recursos manualmente en sus respectivos directorios src / buildtypeORflavor / res.
Elimine las referencias al complemento de servicios de google y el archivo JSON después de eso, y ya está.
Para obtener información detallada sobre el funcionamiento interno de google-services gradle-plugin, consulte mi otra respuesta:
https://stackoverflow.com/a/33083898/433421
fuente
Simplificando lo que dijo @Scotti. Debe crear aplicaciones Múltiples con un nombre de paquete diferente para un Proyecto en particular, dependiendo del sabor del producto.
Suponga que su Proyecto es ABC con diferentes sabores de productos X, Y donde X tiene un nombre de paquete com.x e Y tiene un nombre de paquete com.y luego en la consola de Firebase necesita crear un proyecto ABC en el que necesita crear 2 aplicaciones con los nombres de paquete com.x y com.y. Luego debe descargar el archivo google-services.json en el que habrá 2 objetos de información del cliente que contendrán esos paquetes y estará listo para comenzar.
Snippet of the json sería algo como esto
fuente
De hecho, juste one google-services.json en el
MyApp/app/
directorio es bueno, no es necesario un script adicional concom.google.gms:google-services:3.0.0
. Pero tenga cuidado de eliminar el archivogoogle-services.json
del directorio de la aplicaciónMyApp/app/src/flavor1/res/
para evitar el tipo de errorExecution failed for task ':app:processDebugGoogleServices'. > No matching client found for package
fuente
Entonces, si desea copiar programáticamente el
google-services.json
archivo de todas sus variantes en su carpeta raíz. Cuando cambia a una variante específica, aquí hay una solución para ustedHay una advertencia sobre este enfoque: es necesario tener un
google-service.json
archivo en cada una de las carpetas de variantes. Aquí hay un ejemplo.fuente
Tiene muchos sabores, por lo que significa que tendrá muchas ID de paquete de diferencia, ¿verdad? Entonces, solo vaya a la página donde configura / genera su archivo json y configúrelo para cada nombre de paquete. Todo se agregará al archivo json.
Estoy muy flojo para publicar una foto ahora, pero básicamente:
Cuando configures el archivo, puedes ver que google te muestra la clave API del servidor + ID del remitente. Y es igual para todos los paquetes (sabores)
Al final, solo necesita un archivo json para todos los sabores.
Una pregunta más aquí que debe probar cuando se registra para obtener el Token de registro, verifique si hay diferencia para cada sabor. No lo toco, pero creo que debería ser la diferencia. Demasiado tarde ahora y tengo tanto sueño :) ¡Espero que ayude!
fuente
Hola amigos, también busca el uso del nombre en minúsculas, entonces no aparece este error
fuente
Actualmente estoy usando dos ID de proyecto GCM en el mismo paquete de aplicación. Puse el google-service.json de mi primer proyecto de GCM, pero cambio del primero al segundo solo cambiando el SENDER_ID:
(En este punto, creo que google-services.json no es obligatorio)
fuente
Inspirado por la respuesta de @ ahmed_khan_89 arriba. Podemos mantener directamente así en el archivo gradle.
fuente
Coloque su archivo "google-services.json" en app / src / flavors respectivamente y luego en build.gradle de la aplicación, en Android agregue el código siguiente
fuente