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:
- 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.
- 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étodosendRegistrationToServer()
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);