Caducidad del registro de Google Cloud Messaging

Estoy utilizando Google Cloud Messaging para mi aplicación de Android y estoy tratando de entender cuando caduca el ID de registro. Desde este post pude entender que Google tiende a actualizar el ID en algún momento. ¿Tengo curiosidad por saber cómo mi aplicación sabrá cuándo se actualiza el ID? Si Google decide actualizar la ID y mi servidor es hasta el envío del mensaje a la antigua ID no creo que el mensaje se enviará. ¿Así que tendría que intentar registrarme cada vez y ver si los ids son iguales?

También el mismo post dice que el id se actualizaría cuando la versión de la aplicación cambia, pero al cambiar la versión a través del manifiesto el registro no cambió. Entonces, ¿qué sentido tiene tratar de registrar de nuevo los cambios de versión?

EDIT Aquí está el lado del servidor. ¿Dónde exactamente se almacenaría el ID canónico?

Código del lado del servidor:

<?php // Message to be sent $message = $_POST['message'];  // Set POST variables $url = 'https://android.googleapis.com/gcm/send';  $fields = array(                 'registration_ids' => array($_POST['registrationIDs']),                 'data'             => array( "message" => $message ),                 );  $headers = array(                     'Authorization: key=' . $_POST['apiKey'],                     'Content-Type: application/json'                 );  // Open connection $ch = curl_init();  // Set the url, number of POST vars, POST data curl_setopt( $ch, CURLOPT_URL, $url );  curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );  curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );  // Execute post $result = curl_exec($ch);  // Close connection curl_close($ch);  echo $result;  ?> 

Estoy tratando de entender cuando caduca el ID de registro

El servidor de GCM normalmente se actualiza (por lo que su ID de registro antiguo ha caducado) los ID de registro. Cuando esto sucede exactamente no está documentado en ninguna parte. Pero se le notificará cuando suceda esto.

¿Cómo se nos notifica?

Cuando envíe una notificación a un ID de registro caducado, por primera vez se enviará el mensaje (notificación) pero obtendrá un nuevo ID de registro con el nombre canonical id . Lo que significa que el ID de registro al que enviaste el mensaje se ha cambiado a este ID canónico, así que cambia también en tu lado del servidor .


Si Google decide actualizar el ID y mi servidor es hasta el envío del mensaje a la antigua ID no creo que el mensaje se enviará

Como he dicho, se enviará por primera vez, incluso después de la expiración.


También el mismo post dice que la identificación se actualizaría cuando la versión de la aplicación cambia

No creo que esto suceda con seguridad. Pero incluso si sucede (cambios de id de registro) es el mismo escenario que se explicó anteriormente, por lo que todo lo que necesita es cuidar el ID canónico .

EDITAR

 $result = curl_exec($ch); $result = json_decode($result); $canonical_ids_count = $result->canonical_ids; if($canonical_ids_count){ //update your DB by replacing the registration id with //the canonical id(new registration id) } 

No estoy seguro de cuándo se actualiza el registro de GCM pero, la documentación del cliente de GCM indica que "Comprobar si se actualizó la aplicación, si es así, debe borrar el ID de registro, ya que no se garantiza que el regID existente funcione con la nueva versión de la aplicación". Así que sí, podría seguir utilizando regId antiguo, pero no está garantizado que no tenga un regId nuevo.

Según http://developer.android.com/google/gcm/client.html#sample-register , a diferencia de las versiones anteriores de GCM y C2DM, Google no actualiza el registro. Una vez que tengas el ID de registro desde el registro inicial, puedes ir, excepto por un caso: todavía tienes que volver a registrar cuando el usuario actualiza a una nueva versión (este caso también se maneja en el ejemplo en el enlace anterior ).

Cuando se actualiza una aplicación, debe invalidar su ID de registro existente, ya que no se garantiza que funcione con la nueva versión. Debido a que no hay un método de ciclo de vida llamado cuando se actualiza la aplicación, la mejor manera de lograr esta validación es almacenando la versión de la aplicación actual cuando se almacena un ID de registro.

Para obtener la última GCM ID Aquí está mi trabajo alrededor.

 $result = curl_exec($ch); $result = json_decode($result, true); $GCMIDChanged = $result['canonical_ids']; if($GCMIDChanged) { $NewGCMId = $result['results'][0]['registration_id']; //Update your DB with $NewGCMId } 

En el código anterior, estoy comprobando si el canonical_ids existe en el resultado.

Si los canonical_ids existen entonces estoy recibiendo el nuevo registration_id

Por lo tanto, ahora el sistema actualizará automáticamente la nueva identificación de Gcm siempre que se cambie.

Actualización:

El código a continuación puede usarse si el Id de GCM se cambia varias veces

 $GCMIDChanged = $result['canonical_ids']; if($GCMIDChanged) { $NewGCMIdList = end($result['results']); $NewGCMId = $NewGCMIdList['registration_id']; } 
  • Hacer dispositivo Android como servidor para enviar mensajes a GCM directamente
  • ¿Cómo comprobar si los usuarios de cuenta de google se ha añadido en el dispositivo antes de iniciar el procedimiento de GCM?
  • ¿Cómo podría Intent ser nulo en onHandleIntent ()?
  • Android Parse Presione el registro de dispositivo de notificación sólo una vez en un dispositivo
  • Dirección IP del servidor de mensajería de Google Cloud
  • Carga útil de notificación de GCM 3.0 que no muestra la notificación de Android cuando la aplicación está en primer plano
  • Recibir notificación de empuje cuando la aplicación se ha detenido de forma forzada (Android).
  • Android: ¿Cómo enviar datos desde el servidor a Android sin solicitud de Android?
  • Registrar GCM de un proyecto de biblioteca
  • Gestionar notificaciones múltiples / apilar notificaciones desde GCM
  • Problema con GCM. Manifiesto malformado como resultado de mayúsculas en el nombre del paquete
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.