121 votes

Firebase (FCM) comment obtenir un jeton

C'est ma première utilisation de la FCM.

J'ai télécharger un exemple de firebase/guide de démarrage rapide-android et j'ai installer le FCM guide de Démarrage rapide.Mais je ne peux pas obtenir un jeton à partir du journal, même frappé le JOURNAL JETON bouton dans l'application.

Alors j'essaie d'envoyer un message avec Firebase console et jeu de cible à mon application nom du package.J'avais un message entrant.

Je veux savoir la FCM peut être utilisé?GCM tout est ok.

Solution:

Parce que je ne suis pas un développeur Android,juste un backend developer.Donc il me faut un certain temps pour le résoudre.À mon avis,il y a un bug 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.
    }
}

Ajouter ceci dans le MainActivity.java.

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

Après le faire ci-dessus,vous pouvez obtenir le Jeton dans le logcat.Mais j'ai enfin trouver un moyen pratique pour l'obtenir.Juste utiliser le mode de débogage pour installer l'exemple d'application , et vous pouvez obtenir le jeton lors de la première de temps pour l'installer.

Mais je n't why it cant imprimer le journal quand je l'installer.Peut-être liées à des systèmes mobiles.

Et puis pourquoi je ne peux pas obtenir la Notification. FirebaseMessagingService.onMessageReceived n'appelle pas sendNotification

154voto

EliaszKubala Points 82

LE PLUS RAPIDE ET LE BON POUR PROTOTYPE

La solution rapide est de le stocker dans sharedPrefs et ajouter cette logique d' onCreate méthode dans votre MainActivity ou de la classe qui est l'extension de l'Application.

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

LE MOYEN LE PLUS PROPRE

Une meilleure option est de créer un service et de le garder à l'intérieur d'une même logique. 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 êtes en mesure d'utiliser une méthode statique de votre Service, MyFirebaseMessagingService.getToken(Context);

LA MANIÈRE LA PLUS RAPIDE MAIS OBSOLÈTE

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

Il travaille toujours lorsque vous utilisez d'anciennes firebase de la bibliothèque à la version 17.x.x

24voto

Yogesh Rathi Points 3528

Une information important.

si le service Google Play est bloqué ou n'est pas en cours d'exécution, le jeton de retour fcm = null

Si le service de jeu fonctionne correctement , puis FirebaseInstanceId.getInstance().getToken() méthode retourne token

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

13voto

Gaurav Points 2153

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.

Donc, je suggère s'il vous plaît désinstaller votre application manuellement et essayez de l'exécuter à nouveau

vous aurez certainement un jeton

9voto

FireUser Points 97

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) {

    }
}
 

7voto

activesince93 Points 1417

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 cela:

    // [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 sendRegistrationToServer()méthode qui sera mise à jour jeton sur le serveur, si vous êtes l'envoi de push les notifications à partir du serveur.

Mise à JOUR:

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

  • L'application supprime l'ID d'Instance
  • L'application est restauré sur un nouvel appareil
  • L'utilisateur désinstalle/réinstaller l'application
  • L'utilisateur efface les données de l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X