Android C2DM: Duplicar mensaje para el mismo dispositivo y la aplicación
Me pregunto si alguien ha enfrentado este problema con Google C2DM ? Este es el escenario al que me enfrento:
- El usuario instala la aplicación y registra con el servidor C2DM una clave de registro.
- El usuario desinstala la aplicación.
- El usuario reinstala la aplicación (y se registra con el servidor C2DM para la nueva clave de registro).
Ahora envío el mensaje de mi servidor al teléfono del usuario y consiguen un mensaje duplicado.
- Android "hola mundo" ejemplo pushnotification
- GCM FC / ID de remitente no establecido en el constructor
- C2DM con ClientLogin obsoleto
- ¿Cómo puedo enviar un mensaje a un dispositivo usando C2DM desde un servidor que ha sido autenticado con OAuth2?
- Algunas consultas sobre C2DM en Android
¿Podría alguien arrojar alguna idea sobre si este es el comportamiento esperado o cómo puedo solucionarlo? Gracias,
- ¿Cuál es el número máximo de caracteres que se pueden mostrar en la notificación push de Android e iOS?
- Notificación Push de Android C2DM
- ¿Es posible detectar la desinstalación de la aplicación de Android?
- GCM (Google Cloud Messaging) no envía error al desinstalar la aplicación
- Fiabilidad de C2DM
- Tamaño máximo de Android C2DM Registration_ID
- PHONE_REGISTRATION_ERROR C2DM en sandwich de helado AVD
- ¿Cuándo expira el status registeredOnServer en Android GCM?
No estoy seguro de si este es el mejor enfoque, pero hay un hilo relevante en el grupo android-c2dm , donde el póster ofrece una técnica:
Estoy enviando la identificación del registro en el mensaje, así que puedo comprobarla contra la identificación de registro almacenada en el dispositivo.
Si no es lo mismo, deséchelo y notifique al servicio que el Id de registro ya no está en uso
Lo malo es el envío de identificación de registro ocupa un poco de espacio en el tamaño del mensaje ya limitado. Pero funciona perfectamente en mi caso ya que mi mensaje original no es más que unos cuantos caracteres.
Esto sólo debe ocurrir para la primera notificación de inserción después de volver a instalar la aplicación.
El servicio C2DM de Google está funcionando en modo pasivo cuando se trata de detectar aplicaciones desinstaladas.
La primera notificación push después de desinstalar su aplicación (sin cancelar el registro de C2DM !!!) NO devolverá ningún error en la respuesta. Sin embargo, la segunda notificación push devolverá un "registro no válido" o "no registrado" códigos de error donde se puede realizar la aplicación se desinstaló.
La razón es que los servidores C2DM devuelven el código de respuesta inmediatamente y sólo entonces intentan empujar al cliente. Cuando el cliente responde que se ha desinstalado una aplicación, se elimina de los servidores C2DM. El siguiente intento de empuje devolverá un código de error inmediatamente.
Otra solución podría ser proporcionar a su servidor un identificador único para el dispositivo. En ese caso, solo puede actualizar el ID de registro para ese UUID cuando el dispositivo intente registrarse después de la reinstalación.
Sí, me he encontrado con el mismo problema y en mi opinión es un gran descuido en la implementación de Android C2DM. IOS se encarga de esto mucho mejor en que una aplicación sólo puede recibir notificaciones para uno y un solo dispositivo token (equivalente a la id de registro de c2dm)
La solución que utilizo es enviar los últimos 10 caracteres del ID de registro como parte de la carga útil de c2dm y, a continuación, en mi método onMessage, hago la siguiente comprobación:
if (!regId.endsWith(bundle.getString("regsuffix"))) return null;
Ambos @ Zamel y @johan respuestas son buenas y deben combinarse. Si combina ambas soluciones, minimizará la base de datos de su servidor.
Así que la mejor solución será:
-
Enviar identificación del dispositivo al enviar el token de empuje al servidor
-
Actualizar token de empuje cuando se envía para identificación de dispositivo existente
- Invalidate token de empuje en la base de datos del servidor, si la notificación push devuelve un código de error "registro no válido" o "no registrado" al servidor
Cuando el token de empuje se reconoce como "registro no válido" o "no registrado", puede invalidarlo (marcarlo como nulo), eliminar la fila de la base de datos o implementar la funcionalidad de caducidad. Depende de tus necesidades
- ¿Cómo obtengo el mejor rendimiento con SQLite en Android?
- ¿Es posible colocar una vista sobre otra en android?