Uso de 2 o más servicios de intención GCM en una aplicación
Estoy escribiendo una aplicación que se integra con Smooch y Carnival . Ambas bibliotecas reciben mensajes push de GCM utilizando el enfoque estándar de definir un servicio de intención GCM para recibir mensajes.
Cuando uso sólo Smooch, todo funciona muy bien. Cuando uso sólo Carnaval, todo funciona muy bien. El problema aparece cuando intento usar ambos. Lo que he encontrado es que el receptor GCM simplemente iniciará el primer servicio listado en el manifiesto que define la intención com.google.android.c2dm.intent.RECEIVE
.
- Android GCM time_to_live issue
- Confundido sobre el proceso de actualización de Token de GCM
- GCM: por qué mi aplicación se bloquea en GCMRegistrar.checkDevice (this);
- Notificación Push de Google Cloud Messaging
- GCM / FCM: no recibe eventos, devolución de llamada de intención de difusión: resultado = CANCELADO
De hecho, encontré que el orden en que las bibliotecas aparecen en mi build.gradle
afecta en qué orden se fusionan sus manifiestos en el manifiesto de aplicación. Así que, si puse smooch primero, funciona (pero Carnival no recibe nada). Y si pongo Carnaval primero, funciona (pero Smooch nunca recibe nada).
¿Cómo puedo manejar múltiples servicios de intención GCM cuando no controlo ninguno de los dos? En general, ¿cómo deberían las aplicaciones definir y administrar múltiples servicios de intención GCM?
- El dispositivo deja de recibir emisiones de GCM hasta que la red se conmuta
- Invalidar todos los tokens gcm
- GCM duplicó mensajes
- Java.io.IOException: SERVICE_NOT_AVAILABLE en el cliente de GCM
- Notificación de empuje para actualizaciones de aplicaciones
- Suscribir temas con el token de Google Cloud Messenger, argumento inválido recibido
- GCM de Android enviado correctamente pero no recibido en algunos dispositivos
- ID de aplicación en gcm android
La razón por la que no se puede obtener push para trabajar en Carnival y Smooch es que ambas bibliotecas están registrando su propio GcmListenerService, y en Android el primer GcmListenerService definido en su manifiesto recibirá todos los mensajes de GCM.
Tengo una solución para usted basada principalmente en el siguiente artículo de SO: Múltiples oyentes de GCM que utilizan GcmListenerService
La mejor solución sería simplemente tener una implementación GcmListenerService, y tener esto manejar mensajes para ambos.
Para especificar su propio GcmListenerService, siga las instrucciones de la documentación de Cloud Messaging de Google .
Smooch proporciona las herramientas necesarias para que deshabilites su registro interno de GCM cuando tengas tu propio.
Para ello, simplemente llame a setGoogleCloudMessagingAutoRegistrationEnabled
al inicializar Smooch:
Settings settings = new Settings("<your_app_token>"); settings.setGoogleCloudMessagingAutoRegistrationEnabled(false); Smooch.init(this, settings);
Y en su propio GcmRegistrationIntentService
, llame a Smooch.setGoogleCloudMessagingToken(token);
Con su ficha.
Una vez que esté completo, podrá pasar el mensaje GCM a cualquier receptor GCM que desee.
@Override public void onMessageReceived(String from, Bundle data) { final String smoochNotification = data.getString("smoochNotification"); if (smoochNotification != null && smoochNotification.equals("true")) { data.putString("from", from); Intent intent = new Intent(); intent.putExtras(data); intent.setAction("com.google.android.c2dm.intent.RECEIVE"); intent.setComponent(new ComponentName(getPackageName(), "io.smooch.core.GcmService")); GcmReceiver.startWakefulService(getApplicationContext(), intent); } }
EDITAR
A partir de Smooch versión 3.2.0, ahora puede activar más fácilmente la notificación de Smooch llamando a GcmService.triggerSmoochGcm
en su onMessageReceived.
@Override public void onMessageReceived(String from, Bundle data) { final String smoochNotification = data.getString("smoochNotification"); if (smoochNotification != null && smoochNotification.equals("true")) { GcmService.triggerSmoochGcm(data, this); } }
¿Está utilizando ambos como dependencias gradle? Tendrás que descargar las dos bibliotecas y usarlas como módulos, probablemente estén usando los mismos servicios, si las descargas puedes cambiar el nombre de los servicios y resolver cualquier problema que pueda corelating ambos.
Mi conjetura es que usted tendrá que probablemente crear el receptor de la difusión de GCM con de su módulo de la aplicación (aunque él llame los servicios de las libs).
- ¿Kotlin Android Extensions pone en caché las propiedades sintéticas o cada vez que llama a findViewById ()?
- Diseño de la ruleta de Android