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
.
- No se puede resolver com.google.android.gcm.GCMBaseIntentService; Estudio de Android
- Recepción de notificaciones de GCM de Android cuando la aplicación está en estado detenido
- Cómo obtener clave de API de GCM, no hay aplicaciones registradas en el menú
- Recepción del mensaje recibido Acknwoledgement From GCM Service
- Cómo agrupar las notificaciones de Android como whatsapp?
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?
- parse.com REST API usando build.phonegap Javascript Push Notifications Android e iOS
- GCM con sistema de inicio de sesión
- GCM deja de funcionar después de algún tiempo
- Java.lang.NoClassDefFoundError: com.google.android.gms.gcm.GoogleCloudMessaging
- ¿Debo usar GCM para la comunicación en tiempo real entre dispositivos?
- GCM y caracteres especiales
- Xiaomi no recibe notificación cuando la aplicación no se está ejecutando
- ¿Puedo recibir mensajes de GCM de dos o más SENDER_ID de GCM en mi aplicación?
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