web-dev-qa-db-fra.com

Firebase (FCM) comment obtenir un jeton

C’est mon premier à utiliser FCM.

Je télécharge un échantillon de firebase/quickstart-Android et j'installe le FCM Quickstart.Mais je ne peux obtenir aucun jeton du journal, même en appuyant sur le bouton LOG TOKEN dans l'application.

Ensuite, j'essaie d'envoyer un message avec la console Firebase et de définir le ciblage sur le nom de mon package d'application. J'ai reçu un message entrant.

Je veux savoir si la FCM peut être utilisée? GCM tout va bien.

Solution:

Parce que je ne suis pas un développeur Android, mais juste un développeur backend.Alors il me faut un certain temps pour le résoudre.À mon avis, il existe un bogue dans l'exemple d'application.

enter image description here

Code:

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.
    }
}
_

Ajoutez ceci dans MainActivity.Java.

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

Après avoir terminé ,, vous pouvez obtenir le jeton dans logcat. Mais enfin, je trouve un moyen pratique de l’obtenir. Utilisez simplement le mode débogage pour installer l’exemple d’application et vous pourrez obtenir le jeton lors de la première installation.

Mais je ne _t why it can_ t imprimer le journal lorsque je l’installe. Peut-être lié au système mobile.

Et puis pourquoi je ne peux pas obtenir la notification. FirebaseMessagingService.onMessageReceived n'a pas appelé sendNotification

70
wyx

PLUS RAPIDE ET BON POUR PROTOTYPE

La solution rapide consiste à le stocker dans sharedPrefs et à ajouter cette logique à la méthode onCreate dans votre classe MainActivity ou extension.

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 :("));

Voie plus propre

Une meilleure option consiste à créer un service et à conserver une logique similaire. Tout d'abord créer un nouveau service

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");
    }
}

Et puis l'ajouter au fichier AndroidManifest

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

Enfin, vous pouvez utiliser une méthode statique à partir de votre service MyFirebaseMessagingService.getToken(Context);

LE PLUS RAPIDE MAIS DÉPRÉCIÉ

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

Cela fonctionne toujours lorsque vous utilisez une bibliothèque Firebase plus ancienne que la version 17.x.x

64
EliaszKubala

Une information important.

si le service Google Play est bloqué ou s'il ne fonctionne pas, alors fcm return token = null

Si le service de lecture fonctionne correctement, la méthode FirebaseInstanceId.getInstance().getToken() renvoie token

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

Selon doc

Migrer une application client GCM vers FCM

onTokenRefresh()

appelé uniquement si le jeton InstanceID est mis à jour

Ainsi, il n'appellera que la première fois lorsque vous installerez une application sur votre appareil.

Je suggère donc de désinstaller votre application manuellement et d'essayer de l'exécuter à nouveau. 

vous aurez certainement JETON 

13
Gaurav

Essaye ça. Pourquoi utilisez-vous RegistrationIntentService?

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

    private void registerToken(String token) {

    }
}
8
FireUser

Cette ligne devrait vous fournir le jeton FCM de la base de feu. 

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

Faites Log.d pour l’imprimer sur le moniteur Android.

8
Alphonsus Chen

Au lieu de cela:

    // [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]

Faire ceci:

    // [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]

Et encore une chose:

Vous devez appeler la méthode sendRegistrationToServer() qui mettra à jour le jeton sur le serveur, si vous envoyez Push notifications du serveur.

METTRE À JOUR:

Un nouveau jeton Firebase est généré (onTokenRefresh() est appelé) lorsque:

  • L'application supprime l'ID d'instance
  • L'application est restaurée sur un nouvel appareil
  • L'utilisateur désinstalle/réinstalle l'application
  • L'utilisateur efface les données de l'application.
7
activesince93

L’équipe derrière Firebase Android SDK change un peu l’API. J'ai implémenté la logique "Token to Server" comme ceci:

Dans mon exemple de FirebaseMessagingService:

public class FirebaseCloudMessagingService extends FirebaseMessagingService {

    ...

    @Override
    public void onNewToken(String token) {
        // sending token to server here
    }

    ...

}

N'oubliez pas que le jeton correspond à un périphérique et qu'il peut être mis à jour par Firebase indépendamment de votre logique de connexion. Par conséquent, si vous disposez des fonctionnalités de connexion et de déconnexion, vous devez envisager des cas supplémentaires:

  1. Lorsqu'un nouvel utilisateur se connecte, vous devez lier un jeton à un nouvel utilisateur (envoyez-le au serveur). En effet, le jeton peut être mis à jour pendant la session de l'ancien utilisateur et le serveur ne connaît pas le jeton du nouvel utilisateur.
  2. Lorsque l'utilisateur se déconnecte, vous devez dissocier le jeton. Parce que, l'utilisateur ne devrait plus recevoir de notifications/messages.

En utilisant une nouvelle API, vous pouvez obtenir un jeton comme ceci:

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

Bonne chance!

7
rzaaeeff

Dans le même temps, n'oubliez pas d'inclure ceci dans votre fichier manifeste pour recevoir l'identifiant de jeton

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

Si vous utilisez une fonction d'authentification de firebase, vous pouvez utiliser un jeton en utilisant ceci

//------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();
                      // ...
                }
            }
        });

Travaillez bien si les utilisateurs sont connectés. getCurrentUser ()

3
Diego Venâncio

Dans firebase-messaging:17.1.0 et plus récent, FirebaseInstanceIdService est obsolète, vous pouvez obtenir onNewToken sur la classe FirebaseMessagingService comme expliqué à https://stackoverflow.com/a/51475096/1351469

Mais si vous voulez juste obtenir le jeton à tout moment, alors maintenant vous pouvez le faire comme ceci:

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

essaye ça

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

pour ceux qui atterrissent ici, FirebaseInstanceIdService est maintenant obsolète, utilisez plutôt:

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);
    }
}

et déclarer dans AndroidManifest

<application... >

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

Vous pouvez utiliser les éléments suivants dans Firebase (FCM) pour obtenir le jeton:

FirebaseInstanceId.getInstance().getToken();
0
Ahmed Sayed

getToken () est obsolète. Vous pouvez utiliser getInstanceId () à la place.

Si vous voulez gérer les résultats lorsque vous demandez instanceId (jeton), vérifiez ce code.

    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()));
0
sNash
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();

            }
        });
0
pruthwiraj.kadam