¿Los tokens de GCM antiguos permanecen encendidos incluso después de una desinstalación?

Hemos estado trabajando en una implementación de GCM y hemos notado que la dirección de un dispositivo asignada a la instalación de una aplicación puede seguir funcionando incluso si la aplicación se desinstala.

Así que instalamos una aplicación, obtenemos el token A, el dispositivo se suscribe a un tipo de alerta particular 1, token de mensaje A con gran éxito. Luego desinstalamos la aplicación.

No reinstalamos, recibimos el token B, y el dispositivo se suscribe a un tipo de alerta particular 2, enviamos el token B con gran éxito.

Dado que no enviamos un mensaje al token A desde el momento en que la aplicación se desinstaló y reinstaló, aún podemos enviar mensajes a ambos tokens, y la aplicación los recibe a ambos.

Si hubiéramos tratado de enviar el token A mientras se desinstaló la aplicación, podríamos haber limpiado eso de la respuesta de Google.

¿Hay alguna forma de saber que el token A ya no es válido técnicamente?

Supongo que con ‘token’ en realidad se está refiriendo a la identificación de registro. Las viejas identificaciones de registro pueden permanecer activas por un tiempo. Sin embargo, Google le dice que debe actualizar su regid para una combinación particular de dispositivo / aplicación mediante la ID canónica en la respuesta a su mensaje enviado.

De la documentación oficial:

Cómo funciona la desinstalación de la aplicación de cliente desinstalada

Una aplicación cliente puede cancelarse automáticamente después de que se desinstala. Sin embargo, este proceso no ocurre de inmediato. Lo que sucede en este escenario es:

  1. El usuario final desinstala la aplicación del cliente.
  2. El servidor de la aplicación envía un mensaje al servidor de conexión de GCM.
  3. El servidor de conexión de GCM envía el mensaje al cliente de GCM en el dispositivo.
  4. El cliente de GCM en el dispositivo recibe el mensaje y detecta que la aplicación del cliente se ha desinstalado; los detalles de detección dependen de la plataforma en la que se ejecuta la aplicación cliente.
  5. El cliente de GCM en el dispositivo informa al servidor de conexión de GCM que la aplicación del cliente se ha desinstalado.
  6. El servidor de conexión de GCM marca el token de registro para su eliminación.
  7. El servidor de aplicaciones envía un mensaje a GCM.
  8. El GCM devuelve un mensaje de error NotRegistered al servidor de la aplicación.
  9. El servidor de la aplicación debe eliminar el token de registro.

Tenga en cuenta que puede tomar un tiempo para que el token de registro se elimine por completo de GCM. Por lo tanto, es posible que los mensajes enviados durante el paso 7 anterior obtengan una ID de mensaje válida como respuesta, aunque el mensaje no se entregue a la aplicación cliente. Finalmente, el token de registro se eliminará y el servidor recibirá un error NotRegistered, sin que se requiera ninguna acción adicional del servidor de la aplicación.

Sin embargo, aparentemente puede ocurrir que aún recibas la notificación de la identificación de registro anterior, como dicen los usuarios en otras preguntas:

Para este problema, hay una funcionalidad llamada “identificaciones canónicas”:

ID canónicos

Si un error en la aplicación del cliente desencadena múltiples registros para el mismo dispositivo, puede ser difícil conciliar el estado y la aplicación del cliente podría terminar con mensajes duplicados.

La implementación de identificaciones canónicas puede ayudarlo a recuperarse más fácilmente de estas situaciones. Un ID de registro canónico es el token de registro del último registro solicitado por la aplicación cliente. Este es el ID que el servidor debe usar al enviar mensajes al dispositivo.

Si intenta enviar un mensaje utilizando un token de registro anterior, GCM procesará la solicitud como de costumbre, pero incluirá la ID canónica en el campo registration_id de la respuesta. Asegúrese de reemplazar el token de registro almacenado en su servidor con esta ID canónica, ya que eventualmente el token de registro anterior dejará de funcionar.