studio google gcm fcm change android token google-cloud-messaging instanceid

google - push notifications android



¿Cuándo caducan los tokens de GCM y qué es el InstanceID? (3)

Dado que GCM sigue actualizándose, la mayoría de los recursos que he buscado parecen obsoletos o poco claros. Básicamente, estoy confundido sobre cuándo expiran los tokens y las ID. (Para referencia, estoy trabajando con Android.)

Por lo que entiendo (y corríjame si me equivoco), mi servidor tiene una clave API y una ID de remitente. Utilizando el ID del remitente, puedo hacer que mi cliente solicite un token a través del InstanceID almacenado localmente en mi cliente. Ya estoy un poco confundido aquí. ¿Se asigna InstanceID en el momento en que mi aplicación se conecta? ¿Alguna vez cambia? ¿Qué pasa cuando la aplicación se actualiza o se desinstala y se vuelve a instalar (o se restaura el dispositivo)? Al llamar a InstanceID.getInstance, ¿recuperaré siempre el mismo InstanceID, o eventualmente vencerá y me dará uno nuevo? ¿Hay algún valor para almacenar la cadena que recuperas llamando a getID ()? Los documentos parecen indicar que realmente recuperas un nuevo InstanceID cuando llamas a getID (), por lo que eso complica aún más las cosas. (Para referencia, me refiero a: https://developers.google.com/instance-id/ )

Con el InstanceID, mi cliente puede solicitar un token de los servidores GCM, que luego envía a mi servidor de aplicaciones. Mi servidor de aplicaciones almacena este token y puede usarlo para enviar mensajes a los servidores GCM, que luego enviarán el mensaje al dispositivo. El dispositivo utiliza el InstanceID almacenado para recibir estos mensajes, creo. Entonces, ¿tener una clase que extienda GcmListenerService me permitirá recibir estos mensajes con onMessageReceived? ¿No tengo que hacer nada especial (aparte de definirlo en el AndroidManifest)? ¿No tengo que decirle realmente que use el ID de instancia? ¿Lo sabe mágicamente?

¿Cuándo expiran estos ID y Tokens? ¿Caducan? Almaceno el token como una cadena en el servidor, pero si en algún momento caduca uno de estos, ¿cómo puedo saber que han caducado? Siempre puedo generar un nuevo InstanceID y un Token, eso parece fácil, pero ¿se mantienen activos los anteriores? ¿Cómo borro los tokens antiguos del servidor? Parece que hay una manera fácil de hacer esto con APNS en el lado de iOS, donde puede recuperar una lista de todos los tokens caducados y simplemente borrarlos de su base de datos.


¿Qué es la identificación de instancia?

La ID de instancia proporciona una ID única para cada instancia de sus aplicaciones. Puede implementar el ID de instancia para las aplicaciones de Android e iOS, así como las aplicaciones / extensiones de Chrome.

Además de proporcionar identificaciones únicas para la autenticación, la identificación de instancia puede generar tokens de seguridad para usar con otros servicios.

Características clave

  • Generar Tokens de Seguridad
  • Verificar la autenticidad de la aplicación
  • Confirmar que el dispositivo de la aplicación está activo
  • Identificar y rastrear aplicaciones

Ciclo de vida de ID de instancia

  1. El servicio de ID de instancia emite un ID de instancia cuando su aplicación se conecta. El InstanceID está respaldado por un par de claves pública / privada con la clave privada almacenada en el dispositivo local y la clave pública registrada con el servicio de identificación de instancia.
  2. Su aplicación puede solicitar un InstanceID nuevo siempre que sea necesario utilizando el método getID (). Su aplicación puede almacenarla en su servidor si tiene una que la admita.
  3. Su aplicación puede solicitar tokens del servicio de identificación de instancia según sea necesario mediante el método getToken (), y al igual que InstanceID, su aplicación también puede almacenar tokens en su propio servidor. Todos los tokens emitidos a su aplicación pertenecen al InstanceID de la aplicación.
  4. Los tokens son únicos y seguros, pero su aplicación o el servicio de identificación de instancia pueden necesitar actualizar tokens en caso de un problema de seguridad o cuando un usuario desinstala y reinstala su aplicación durante la restauración del dispositivo. Su aplicación debe implementar un escucha para responder a las solicitudes de actualización de token del servicio de ID de instancia.

¿Cuándo se invalida la ID de instancia?

  • La aplicación elimina el ID de instancia
  • El dispositivo es restablecido de fábrica
  • El usuario desinstala la aplicación
  • El usuario borra los datos de la aplicación

Si la ID de instancia se ha invalidado, la aplicación puede llamar a getId () para solicitar una nueva ID de instancia. Para demostrar la propiedad de la ID de instancia y permitir que los servidores accedan a datos o servicios asociados con la aplicación, llame a getToken (String, String).

¿Cuándo actualizar tokens?

El servicio de ID de instancia inicia devoluciones de llamada periódicamente (por ejemplo, cada 6 meses), solicitando que su aplicación actualice sus tokens. También puede iniciar devoluciones de llamada cuando:

Hay problemas de seguridad; por ejemplo, SSL o problemas de plataforma. La información del dispositivo ya no es válida; por ejemplo, copia de seguridad y restauración. El servicio de ID de instancia se ve afectado de otra manera.

Todo lo que necesita saber sobre la identificación de la instancia se puede encontrar en los siguientes enlaces oficiales:


@ pumpkinpie65 y @B. Roth es lo que hice para detectar tokens no válidos en mi base de datos.

hay una opción de "ejecución en seco" en GCM al enviar una notificación al usuario / lista de usuarios. Cuando configura la ejecución en seco al enviar notificaciones, no alerta a los clientes ni les muestra notificaciones, sino que devuelve una respuesta sobre qué tokens son válidos (200) y cuáles no.

Si envía una notificación a 200 usuarios con la opción de ejecución en seco, en el mismo orden obtendrá la respuesta de GCM.


Me encontré haciendo la mayoría de estas preguntas cuando actualizo mi implementación de GCM. Después de jugar un par de días con él, he aquí mi opinión sobre sus preguntas.

Por lo que entiendo (y corríjame si me equivoco), mi servidor tiene una clave API y una ID de remitente. Utilizando el ID del remitente, puedo hacer que mi cliente solicite un token a través del InstanceID almacenado localmente en mi cliente.

Esto es correcto.

¿Se asigna InstanceID en el momento en que mi aplicación se conecta?

Parece que se asigna en cuanto se inicia la aplicación, incluso si el dispositivo no puede acceder a Internet.

¿Alguna vez cambia? ¿Qué pasa cuando la aplicación se actualiza o se desinstala y se vuelve a instalar (o se restaura el dispositivo)? Al llamar a InstanceID.getInstance, ¿recuperaré siempre el mismo InstanceID, o eventualmente vencerá y me dará uno nuevo?

Según la developers.google.com/android/reference/com/google/android/gms/… :

La ID de instancia es estable pero puede volverse inválida si:

  • La aplicación elimina el ID de instancia
  • El dispositivo es restablecido de fábrica
  • El usuario desinstala la aplicación
  • El usuario borra los datos de la aplicación

Si la ID de instancia se ha invalidado, la aplicación puede llamar a getId () para solicitar una nueva ID de instancia.

He probado la desinstalación de la aplicación y el borrado de los datos, y los resultados apuntan a que todo lo anterior es cierto.

¿Hay algún valor para almacenar la cadena que recuperas llamando a getID ()?

Parece que la API se encarga de almacenar esto en el almacenamiento local de su aplicación para usted.

Con el InstanceID, mi cliente puede solicitar un token de los servidores GCM, que luego envía a mi servidor de aplicaciones. Mi servidor de aplicaciones almacena este token y puede usarlo para enviar mensajes a los servidores GCM, que luego enviarán el mensaje al dispositivo. El dispositivo utiliza el InstanceID almacenado para recibir estos mensajes, creo. Entonces, ¿tener una clase que extienda GcmListenerService me permitirá recibir estos mensajes con onMessageReceived? ¿No tengo que hacer nada especial (aparte de definirlo en el AndroidManifest)? ¿No tengo que decirle realmente que use el ID de instancia? ¿Lo sabe mágicamente?

Por lo que puedo decir, no hubo ningún tipo de InstanceId en la implementación anterior, y tampoco parece que se esté utilizando explícitamente en esta. Si es así, se está llamando dentro de GcmReceiver o GcmListenerService .

¿Cuándo expiran estos ID y Tokens? ¿Caducan?

Ya me he referido a la caducidad de las identificaciones y podemos averiguar sobre las señales que caducan en la guía de implementación de InstanceID de Android :

El servicio de ID de instancia inicia devoluciones de llamada periódicamente (por ejemplo, cada 6 meses), solicitando que su aplicación actualice sus tokens. También puede iniciar devoluciones de llamada cuando:

  • Hay problemas de seguridad; por ejemplo, SSL o problemas de plataforma.
  • La información del dispositivo ya no es válida; por ejemplo, copia de seguridad y restauración.
  • El servicio de ID de instancia se ve afectado de otra manera.

La guía dice a la subclase InstanceIDListenerService y sobreescribe onTokenRefresh() para manejar estos escenarios.

Almaceno el token como una cadena en el servidor, pero si en algún momento caduca uno de estos, ¿cómo puedo saber que han caducado?

La guía para implementar GCM en su servidor dice que el servidor GCM responderá a su servidor con cierta información sobre el token que utilizó para intentar enviar la notificación de inserción.

Siempre puedo generar un nuevo InstanceID y un Token, eso parece fácil, pero ¿se mantienen activos los anteriores?

Mis pruebas sugieren que sí, lo hacen.

¿Cómo borro los tokens antiguos del servidor? Parece que hay una manera fácil de hacer esto con APNS en el lado de iOS, donde puede recuperar una lista de todos los tokens caducados y simplemente borrarlos de su base de datos.

Todavía estoy investigando esto y actualizaré si puedo resolver algo.