Android SDK obtiene un error NotRegistered de GCM después de unas horas

El problema

Estoy escribiendo y Android SDK que debe recibir mensajes de GCM push desde el lado del servidor SDK. Después de unas pocas horas de envío de mensajes push con éxito, el servidor GCM devuelve un error NotRegistered :

 { "multicast_id":6205350692941230304, "success":0, "failure":1, "canonical_ids":0, "results": [ { "error":"NotRegistered" } ] } 

El registrationId en el cliente no ha cambiado, y el lado del servidor se actualiza con ese token.

¿Cómo puedo solucionar el problema registrationId ? Es tener dos oyentes – uno en el SDK, uno en la aplicación – un problema?

Arquitectura

Mi SDK de Android registra una regId GCM al inicializar y envía ese identificador al servidor que admite el SDK.

La aplicación de abrazar podría (y normalmente lo hace) registrar un regId de GCM propio. El otro regId probablemente se envía al servidor de la aplicación abrazando.

El senderId del SDK y la aplicación son diferentes.

Implementación

Manifiesto

 <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> ... <receiver android:name="com.xxxx.xxxxx.xxxxx" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </receiver> 

Código de registro

 protected String doInBackground(Void... params) { String msg = ""; try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(mContext); } regid = gcm.register(SENDER_ID); msg = "Device registered, registration ID=" + regid; storeRegistrationId(mContext, regid); listener.onGCMRegisterFinish(regid); } catch (IOException ex) { msg = "Error :" + ex.getMessage(); } return msg; } 

Este código obtiene el regId del servidor GCM y lo envía a nuestro servidor backend. Se ejecuta en la inicialización del SDK y el regId se envía cada vez que la aplicación vuelve del fondo.

Notas

  • unregister() no se llama, ni desde el servidor ni desde el lado del cliente
  • Estoy levantando un brindis con el registro de identificación de vez en cuando, así que puedo verificar que es el mismo entre el cliente y el servidor:

Lado del cliente

Introduzca aquí la descripción de la imagen

Lado del servidor

 2015-08-02 12:31:22,383 INFO - request_2145354041215926507 update push token for user: XXXXXXXX, push_token: ...me1GttmSRipnWsCGVUueK7e0nk 

Agregue Categoría con su nombre de paquete al intent-filter

  <receiver android:name=".xxxxx" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <!-- Receives the actual messages. --> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.xxxx" /> </intent-filter> </receiver> 

La generación de ID de registro incluye no sólo el dispositivo, sino también la aplicación y el ID de remitente. Si he entendido correctamente tu arquitectura, ¿quieres implementar una GCM-client-library (tu SDK) que permite a tu aplicación usar GCM a través de tu biblioteca? Si eso es cierto asegúrese de que sólo se registra una vez

El senderId del SDK y la aplicación son diferentes

Supongo que este es el problema, usted tiene que registrar cada aplicación con un identificador de remitente (por ejemplo, XYZ) y utilizar el ID de remitente SAME en el servidor para enviar la notificación. No es posible utilizar ABC como identificador de remitente para enviar notificaciones a un dispositivo registrado para el identificador de remitente XYZ

  • ¿Alguien tiene impresiones, sugerencias, tutoriales de desarrollo para dispositivos Android de Google?
  • No se pueden actualizar las herramientas SDK de Android
  • Administrador SDK Host desconocido dl-ssl.google.com
  • ¿Cómo puedo crear aplicaciones para Android que funcionen con Apple Airplay?
  • Keytool con Android SDK de Facebook
  • Eclipse incorrectamente alegando que tengo viejo Rev de SDK de Android
  • Android SDK no se puede instalar
  • Mi teléfono no se puede detectar en eclipse para ejecutar la prueba
  • Excluir la pantalla xLarge para la versión de Android SDK 2.1
  • ¿Qué versión de Apache HttpClient se utiliza en Android 4.2.2 SDK?
  • ¿Qué SDK de Android debo usar ahora?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.