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:

  1. El usuario instala la aplicación y registra con el servidor C2DM una clave de registro.
  2. El usuario desinstala la aplicación.
  3. 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.

¿Podría alguien arrojar alguna idea sobre si este es el comportamiento esperado o cómo puedo solucionarlo? Gracias,

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á:

  1. Enviar identificación del dispositivo al enviar el token de empuje al servidor

  2. Actualizar token de empuje cuando se envía para identificación de dispositivo existente

  3. 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 puedo obtener mi dispositivo de ID de registro
  • Agente MDM en iOS
  • Cualquier persona haciendo C2DM en Android
  • Cómo obtener el símbolo de autorización de C2DM para usar el dirigible urbano
  • No se puede iniciar el servicio Intent {act = com.google.android.c2dm.intent.REGISTER (tiene extras)}: no encontrado
  • Seguridad de mensajería en nube google
  • Implementación C2DM código PHP
  • No se puede agregar la cuenta de Google en Google App Emulator
  • ¿El servicio GCM es confiable para notificaciones push a gran escala?
  • Notificación push de C2DM sin MQTT, UA en android api level <8
  • Id de registro de Android c2dm falla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.