Registro de GCM con dos identificadores de registro de trabajo diferentes

Tengo un pequeño problema con la administración de registro de dispositivos en mi cliente / servidor para las notificaciones push.

Problema

El problema que estoy teniendo es que cuando desinstalo la aplicación y vuelvo a instalarla la aplicación devuelve una cadena vacía para el ID de registro ( GCMRegistrar.getRegistrationId(this) ) que vuelvo a registrar el dispositivo con mi servidor. El problema es que recibo una nueva identificación de registro diferente (a veces) y AMBOS TRABAJO! Así que no sé cómo servidor para saber si es para el mismo dispositivo. También debo notar que no estoy cambiando la versión de la aplicación. ¿Algún cambio en el manifiesto desencadena un nuevo ID de registro que se emitirá?

En el lado de Android, hago lo siguiente:

     Todos los derechos reservados
      * Registra este dispositivo android con GCM
      * /
     Private void registerDeviceWithGCM () {
         GCMRegistrar.checkDevice (este);
         GCMRegistrar.checkManifest (este);
         Cadena regId = GCMRegistrar.getRegistrationId (este);
         If (regId.equals ("")) {
             Log.debug ("Registro de aplicaciones con GCM");
             GCMRegistrar.register (esto, ApplicationData.SENDER_ID);
         } Else {
             Log.debug ("Ya registrado:" + regId);
             DeviceRegistrationService.updateServerRegistrationData (esto, regId);
         }
     }

En mi GCMIntentService.java hago lo siguiente:

     Todos los derechos reservados
      * Se activa al registrar nuevos dispositivos y actualiza la información de registro con el servidor
      *
      * Contexto de contexto @param recibido de
      * ID de registro del dispositivo @param regId
      * /
     @Anular
     Protected void onRegistered (Context context, String regId) {
         Log.d (TAG, "Registro:" + regId);
         Intención intention = new Intent (RegistrationReceiver.REGISTRATION_INT);
         Intent.putExtra (RegistrationReceiver.REGISTRATION_ID, regId);
         Context.sendBroadcast (intención);
     }

En mi RegistrationReceiver.java tengo lo siguiente:

     Todos los derechos reservados
      * Dispara el registro del dispositivo con cirrus
      *
      * @param context no utilizado
      * @param intento usado para obtener la identificación de registro
      * /
     @Anular
     Public void handleReceive (Context context, intención de intención) {
         Log.debug ("Registro recibido con acción intencional:" + intento.getAcción ());
         If (intent.getAction (). Es igual (REGISTRATION_INTENT)) {
             Cadena regId = intent.getStringExtra (REGISTRATION_ID);
             Log.debug ("Intención de registro recibida con id de registro:" + regId);
             DeviceRegistrationService.updateServerRegistrationData (loginActivity, regId);
         } Else if (intent.getAction (). Iguales (REGISTRATION_FAILED_INTENT)) {
             Log.debug ("Error de registro recibido, mensaje de error");
             ShowRegistrationFailedMessage (intención);
         }
     }

Una vez más, el problema aquí es que tengo dos o más identificación de registro que todo el trabajo (no sería un problema si la vieja simplemente no funcionaba al intentar publicar un mensaje desde el servidor como puedo simplemente limpiar que arriba).

A veces Google cambia el ID de registro y tendrás varios ID asociados. El servidor que envía la notificación (su servidor) debe actualizar la base de datos con el nuevo ID.

Para más información, consulte este documento:

http://developer.android.com/google/gcm/adv.html

Que dice:

En el lado del servidor, siempre y cuando la aplicación se comporte bien, todo debería funcionar normalmente. Sin embargo, si un error en la aplicación activa varios registros para el mismo dispositivo, puede ser difícil reconciliar el estado y puede terminar con mensajes duplicados.

GCM proporciona una instalación denominada "ID de registro canónico" para recuperarse fácilmente de estas situaciones. Un ID de registro canónico se define como el ID del último registro solicitado por la aplicación. Éste es el ID que el servidor debe utilizar al enviar mensajes al dispositivo.

Si más adelante intenta enviar un mensaje utilizando un ID de registro diferente, GCM procesará la solicitud como de costumbre, pero incluirá el ID de registro canónico en el campo registration_id de la respuesta. Asegúrese de reemplazar el ID de registro almacenado en su servidor con este ID canónico, ya que eventualmente el ID que está utilizando dejará de funcionar.

  • Los dispositivos Android 4.x reciben mensajes GCM, pero los dispositivos Android 2.3
  • Cordova PushPlugin - No se puede recibir notificación de GCM en android si la aplicación no se está ejecutando
  • ¿Puedo recibir mensajes de GCM de dos o más SENDER_ID de GCM en mi aplicación?
  • Notificación de envío extra enviada al dispositivo Android
  • Registro de identificación del dispositivo directamente con Amazon SNS
  • Notificación de Push en Android?
  • Mensajes de GCM no se entregan
  • ¿Debo solicitar un nuevo token cada vez que lance mi aplicación para Android?
  • Notificación de sonido, vibración y LED no funcionan
  • Visualización de emojis en el contenido de la notificación
  • Dirigible Urbano - Push Sample => APID es cada vez nulo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.