works with studio sending notification how example android firebase notifications google-cloud-messaging firebase-cloud-messaging

android - with - Error de token no registrado después de enviar una notificación



push notification server firebase (4)

Estoy enfrentando este problema dramático con mi aplicación de Android mientras uso Firebase. 1. Mi aplicación recibe el token en el primer lanzamiento 2. Puedo enviar una notificación desde la consola de firebase al token registrado 3. Si intento enviar una notificación nuevamente con la consola justo después del paso 2. Me muestra el "token no registrado" después del segundo intento en adelante.

Ya tengo toda la configuración necesaria en el archivo de manifiesto y google service.json también está en su lugar con la configuración correcta. Creo que las cosas son correctas porque la aplicación puede recibir notificaciones una vez y el problema comienza a surgir solo después de eso.

Actualización 1: si desinstalo la aplicación y la reinstalo, también puedo recibir notificaciones solo una vez.

Aquellos que quieren ver el código, así es como me estoy poniendo:

@Override public void onTokenRefresh() { //Getting registration token refreshedToken = FirebaseInstanceId.getInstance().getToken(); //Displaying token on logcat Log.d(TAG, "Refreshed token: " + refreshedToken); saveDeviceToken(refreshedToken); }

Esto solo recibe llamadas al primer lanzamiento y después de eso, no lo he visto recibir llamadas (lo que creo que es el comportamiento esperado).

OnMessage recibido también se llama en la primera notificación y luego nunca se cancela:

@Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d("FCM", "From: " + remoteMessage.getFrom()); if (remoteMessage.getNotification() != null) { Log.d("FCM", "Notification Message Body: " + remoteMessage.getNotification().getBody()); sendNotification(remoteMessage.getNotification().getBody()); } }

Actualización 2: Intenté golpear la API HTTP de FCM usando la misma clave de servidor y token y obtuve la siguiente respuesta:

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

Solo para evitar preguntas cruzadas aquí hay algunos detalles más:

  • Estudio de Android: v2.3.1
  • Versión del servicio de Google Play: 10.0.1
  • Las bibliotecas incluyen: núcleo, base de datos, almacenamiento, mensajería: todo tiene la misma versión que el servicio de Google Play 10.0.1

Actualización 3: Firebase crash, la base de datos y el almacenamiento funcionan en el mismo proyecto (lo que muestra que el archivo google service.json es correcto).

Por favor ayúdame a arreglarlo.


Aquí cómo me arreglé.

Como lo señaló todo el mundo, el nombre del paquete del archivo .json podría ser la razón principal de este error, que también se hizo realidad aquí, pero con un giro inesperado.

Descargué el archivo .json de Firebase y asumí que el archivo .json correcto se estaba descargando. Desafortunadamente, debido a un error en Firebase al descargar el archivo, siempre recibía el archivo .json de algunos de mis otros proyectos (la aplicación firebase). Al invertir el archivo descargado, lo resolví y cambié el nombre del paquete y las claves manualmente en el archivo .json.

Yo sugerí a todos que revisen el archivo .json incluido antes de intentar cualquier otra cosa, ya que esa es la razón principal de este tipo de problema.


El token de registro puede cambiar cuando:

  • La aplicación elimina el ID de instancia
  • La aplicación se restaura en un nuevo dispositivo.
  • El usuario desinstala / reinstala la aplicación
  • El usuario borra los datos de la aplicación.

Puedes ver la documentación here

y puede leer here también sobre los errores de fcm que esto ocurre solo en el modo de depuración, por lo que puede llamar a este método en su iniciador. Aceptará el certificado HTTPS del servidor de prueba / desarrollo, ya que el certificado HTTPS no es válido / no es confiable. estar bien.

private void RegisterFireBase() { if (BuildConfig.DEBUG) { Task.Run(() => { var instanceId = FirebaseInstanceId.Instance; instanceId.DeleteInstanceId(); Android.Util.Log.Debug("TAG", "{0} {1}", instanceId?.Token?.ToString(), instanceId.GetToken(GetString(Resource.String.gcm_defaultSenderId), Firebase.Messaging.FirebaseMessaging.InstanceIdScope)); }); ServicePointManager.ServerCertificateValidationCallback += (o, certificate, chain, errors) => true; }


FCM es lo contrario de GCM.

Mientras se usan las clases de GCM, el TokenID se actualiza de vez en cuando por eso también se actualiza en la Base de datos en el servidor.

Durante el uso de FCM. La arquitectura básica de FCM funciona en TokenID único, esta es la razón por la que onTokenRefresh no invoca varias veces. Solo invoca una vez.

Lo que debe hacer es guardar el ID de token generado inicialmente y utilizarlo en consecuencia.

PS: En FCM, el token no se actualiza hasta que se reinstale la aplicación.


Recuerdo haber enfrentado el problema similar antes. Esto es lo que hice y está funcionando bien para mí. Espero que esto ayude,

PreferenceStore es una clase auxiliar para guardar, editar y eliminar preferencias compartidas.

@Override public void onTokenRefresh() { String token = FirebaseInstanceId.getInstance().getToken(); Log.i(TAG, "New FCM Token: " + token); setup_flag = PreferenceStore.getBoolean(getApplicationContext(), PrefKeys.IS_FIRST_FCM_TOKEN); if (!setup_flag) { // save token and boolean value in shared preferences for // the first time you run the app after install PreferenceStore.saveString(getApplicationContext(), "FCM_TOKEN", token); PreferenceStore.saveBoolean(getApplicationContext(), "IS_FIRST_FCM_TOKEN", true); } else { // other time your app loads, update the token (like call the API endpoint). } }