studio registro notificaciones firebasemessagingservice fcm android firebase firebase-cloud-messaging

android - registro - Firebase(FCM) cómo obtener token



token android studio (16)

Es el primero en usar FCM.

firebase/quickstart-android una muestra de firebase/quickstart-android e instalo el FCM Quickstart, pero no puedo obtener ningún token del registro ni siquiera presiono el botón LOG TOKEN en la aplicación.

Luego trato de enviar un mensaje con la consola Firebase y configuré el destino para el nombre del paquete de mi aplicación. Recibí cualquier mensaje entrante.

Quiero saber si se puede usar FCM: GCM, todo está bien.

Solución:

Como no soy un desarrollador de Android, solo soy un desarrollador de back-end, por lo que me lleva un tiempo resolverlo. En mi opinión, hay algún error en la aplicación de muestra.

Código:

RegistrationIntentService.java

public class RegistrationIntentService extends IntentService { private static final String TAG = "RegIntentService"; public RegistrationIntentService() { super(TAG); } @Override protected void onHandleIntent(Intent intent) { String token = FirebaseInstanceId.getInstance().getToken(); Log.i(TAG, "FCM Registration Token: " + token); } }

MyFirebaseInstanceIDService.java

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "MyFirebaseIIDService"; /** * Called if InstanceID token is updated. This may occur if the security of * the previous token had been compromised. Note that this is called when the InstanceID token * is initially generated so this is where you would retrieve the token. */ // [START refresh_token] @Override public void onTokenRefresh() { // Get updated InstanceID token. // String refreshedToken = FirebaseInstanceId.getInstance().getToken(); // Log.d(TAG, "Refreshed token: " + refreshedToken); // // // TODO: Implement this method to send any registration to your app''s servers. // sendRegistrationToServer(refreshedToken); // Intent intent = new Intent(this, RegistrationIntentService.class); startService(intent); } // [END refresh_token] /** * Persist token to third-party servers. * <p> * Modify this method to associate the user''s FCM InstanceID token with any server-side account * maintained by your application. * * @param token The new token. */ private void sendRegistrationToServer(String token) { // Add custom implementation, as needed. } }

Agregue esto en MainActivity.java.

Intent intent = new Intent(this, RegistrationIntentService.class); startService(intent);

Después de hacer lo anterior, puede obtener el token en logcat, pero finalmente encuentro una forma conveniente de obtenerlo. Simplemente use el modo de depuración para instalar la aplicación de muestra y puede obtener el token la primera vez que lo instale.

Pero no sé t why it can imprimir el registro cuando lo instalo. Puede que esté relacionado con el sistema móvil.

Y entonces, ¿por qué no puedo recibir la Notificación? FirebaseMessagingService.onMessageReceived no llamó a sendNotification


MÁS RÁPIDO Y BUENO PARA EL PROTOTIPO

La solución rápida es almacenarlo en sharedPrefs y agregar esta lógica al método onCreate en su MainActivity o clase que está extendiendo la Aplicación.

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this, instanceIdResult -> { String newToken = instanceIdResult.getToken(); Log.e("newToken", newToken); getActivity().getPreferences(Context.MODE_PRIVATE).edit().putString("fb", newToken).apply(); }); Log.d("newToken", getActivity().getPreferences(Context.MODE_PRIVATE).getString("fb", "empty :("));

MANERA MÁS LIMPIA

Una mejor opción es crear un servicio y mantener una lógica similar. Primero crea un nuevo servicio

public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onNewToken(String s) { super.onNewToken(s); Log.e("newToken", s); getSharedPreferences("_", MODE_PRIVATE).edit().putString("fb", s).apply(); } @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); } public static String getToken(Context context) { return context.getSharedPreferences("_", MODE_PRIVATE).getString("fb", "empty"); } }

Y luego agregarlo al archivo AndroidManifest

<service android:name=".MyFirebaseMessagingService" android:stopWithTask="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>

Finalmente, puede utilizar un método estático desde su Servicio MyFirebaseMessagingService.getToken(Context);

EL MÁS RÁPIDO PERO DEPRECADO

Log.d("Firebase", "token "+ FirebaseInstanceId.getInstance().getToken());

Todavía funciona cuando está utilizando una biblioteca de Firebase anterior a la versión 17.xx


Al mismo tiempo, no olvide incluir esto en su archivo de manifiesto para recibir la identificación del token

<service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service>


El equipo detrás de Firebase Android SDK cambia un poco la API. He implementado la lógica "Token to Server" de esta manera:

En mi instancia de FirebaseMessagingService:

public class FirebaseCloudMessagingService extends FirebaseMessagingService { ... @Override public void onNewToken(String token) { // sending token to server here } ... }

Tenga en cuenta que el token es por dispositivo, y Firebase lo puede actualizar independientemente de su lógica de inicio de sesión. Entonces, si tiene la funcionalidad de Iniciar sesión y Cerrar sesión, debe considerar casos adicionales:

  1. Cuando un nuevo usuario inicia sesión, debe vincular el token al nuevo usuario (enviarlo al servidor). Debido a que el token podría actualizarse durante la sesión del antiguo usuario y el servidor no conoce el token del nuevo usuario.
  2. Cuando el usuario cierra la sesión, debe desvincular el token. Porque el usuario ya no debería recibir notificaciones / mensajes.

Con la nueva API, puede obtener tokens como este:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String token = instanceIdResult.getToken(); // send it to server } });

¡Buena suerte!


El método getToken() está en desuso. Puede usar getInstanceId() lugar.

Si desea manejar los resultados cuando solicita instanceId(token) , verifique este código.

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(instanceIdResult -> { if (instanceIdResult != null) { String token = instanceIdResult.getToken(); if (!TextUtils.isEmpty(token)) { Log.d(TAG, "retrieve token successful : " + token); } } else{ Log.w(TAG, "instanceIdResult should not be null.."); } }).addOnFailureListener(e -> { //do something with e }).addOnCanceledListener(() -> { //request has canceled }).addOnCompleteListener(task -> Log.v(TAG, "task result : " + task.getResult().getToken()));


En firebase-messaging:17.1.0 y posteriores, FirebaseInstanceIdService está en desuso, puede obtener onNewToken en la clase FirebaseMessagingService como se explica en https://.com/a/51475096/1351469

Pero si desea obtener el token en cualquier momento, ahora puede hacerlo así:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( this.getActivity(), new OnSuccessListener<InstanceIdResult>() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String newToken = instanceIdResult.getToken(); Log.e("newToken",newToken); } });


En lugar de esto:

// [START refresh_token] @Override public void onTokenRefresh() { // Get updated InstanceID token. // String refreshedToken = FirebaseInstanceId.getInstance().getToken(); // Log.d(TAG, "Refreshed token: " + refreshedToken); // // TODO: Implement this method to send any registration to your app''s servers. // sendRegistrationToServer(refreshedToken); // Intent intent = new Intent(this, RegistrationIntentService.class); startService(intent); } // [END refresh_token]

Hacer esto:

// [START refresh_token] @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); // Log.d(TAG, "Refreshed token: " + refreshedToken); // Implement this method to send token to your app''s server sendRegistrationToServer(refreshedToken); } // [END refresh_token]

Y una cosa más:

sendRegistrationToServer() llamar al método sendRegistrationToServer() que actualizará el token en el servidor, si está enviando notificaciones push desde el servidor.

ACTUALIZAR:

Se genera un nuevo token de Firebase onTokenRefresh() se llama a onTokenRefresh() ) cuando:

  • La aplicación elimina la 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.

Esta línea debería obtener el token FCM de Firebase.

String token = FirebaseInstanceId.getInstance().getToken(); Log.d("MYTAG", "This is your Firebase token" + token);

Haga Log.d para imprimirlo en el monitor de Android.


Prueba esto. ¿Por qué estás usando RegistrationIntentService ?

public class FirebaseInstanceIDService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { String token = FirebaseInstanceId.getInstance().getToken(); registerToken(token); } private void registerToken(String token) { } }


Puedes usar lo siguiente en Firebase (FCM) para obtener el token:

FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (!task.isSuccessful()) { Log.w(TAG, "getInstanceId failed", task.getException()); return; } // Get new Instance ID token String **token** = task.getResult().getToken(); } });


Según el doc.

Migrar una aplicación de cliente GCM a FCM

onTokenRefresh()

solo se llama si se actualiza el token InstanceID

Por lo tanto, solo llamará por primera vez cuando instale una aplicación en su dispositivo.

Así que le sugiero que desinstale su aplicación manualmente e intente ejecutar nuevamente

definitivamente te TOKEN


Si está utilizando alguna función de autenticación de firebase, puede tomar el token usando esto:

//------GET USER TOKEN------- FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser(); mUser.getToken(true) .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() { public void onComplete(@NonNull Task<GetTokenResult> task) { if (task.isSuccessful()) { String idToken = task.getResult().getToken(); // ... } } });

Funciona bien si el usuario está registrado. getCurrentUser ()


para aquellos que aterrizan aquí, hasta ahora FirebaseInstanceIdService está en desuso ahora, use en su lugar:

public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onNewToken(String token) { Log.d("MY_TOKEN", "Refreshed token: " + token); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // Instance ID token to your app server. // sendRegistrationToServer(token); } }

y declarar en AndroidManifest

<application... > <service android:name=".fcm.MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> </application>


prueba esto

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(OnSuccessListener<InstanceIdResult> { instanceIdResult -> fcm_token = instanceIdResult.token}


Información importante.

si el servicio de Google Play se colgó o no se ejecuta, entonces fcm return token = null

Si el servicio de reproducción funciona correctamente, el FirebaseInstanceId.getInstance().getToken() devuelve el token

Log.d("FCMToken", "token "+ FirebaseInstanceId.getInstance().getToken());


FirebaseInstanceId.getInstance().getToken();


Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);