webentwicklung-frage-antwort-db.com.de

Firebase (FCM) wie man Token erhält

Es ist mein erster Einsatz von FCM.

Ich lade ein Beispiel von firebase/quickstart-Android herunter und installiere den FCM-Quickstart. Aber ich kann keine Token aus dem Protokoll erhalten, selbst wenn Sie die Taste LOG TOKEN in der App drücken.

Dann versuche ich, eine Nachricht mit der Firebase-Konsole zu senden, und setze das Ziel auf den Namen des App-Pakets. Ich erhielt eine eingehende Nachricht.

Ich möchte wissen, ob FCM verwendet werden kann. GCM ist alles in Ordnung.

Lösung:

Da ich kein Android-Entwickler bin, sondern nur ein Backend-Entwickler. Daher dauert es einige Zeit, um das Problem zu lösen. Meiner Meinung nach gibt es einen Fehler in der Beispiel-App.

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

Fügen Sie dies in der MainActivity.Java hinzu.

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

Nach oben , können Sie das Token in logcat abrufen. Aber schließlich finde ich einen bequemen Weg, um es zu erhalten .Verwenden Sie den Debug-Modus, um die Beispiel-App zu installieren, und Sie können das Token beim ersten Mal abrufen um es zu installieren.

Aber ich dont why it cant drucke das Protokoll, wenn ich es installiere.

Und warum bekomme ich die Benachrichtigung nicht? FirebaseMessagingService.onMessageReceived hat sendNotification nicht aufgerufen.

56
wyx

SCHNELLSTE UND GUT FÜR PROTOTYP

Die schnelle Lösung ist, es in sharedPrefs zu speichern und diese Logik der onCreate-Methode in Ihrer MainActivity- oder Klasse hinzuzufügen, die Application erweitert.

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

REINIGERWEG

Eine bessere Option ist, einen Dienst zu erstellen und eine ähnliche Logik einzuhalten. Erstellen Sie zunächst einen neuen 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");
    }
}

Fügen Sie es dann der AndroidManifest-Datei hinzu

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

Schließlich können Sie eine statische Methode aus Ihrem Dienst MyFirebaseMessagingService.getToken(Context); verwenden.

DAS SCHNELLSTE ABER

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

Es funktioniert immer noch, wenn Sie eine ältere Firebase-Bibliothek als Version 17.x.x verwenden

64
EliaszKubala

Wichtige Informationen.

wenn der Google Play-Dienst nicht funktioniert oder nicht ausgeführt wird, dann fcm return token = null

Wenn der Wiedergabedienst ordnungsgemäß funktioniert, gibt die FirebaseInstanceId.getInstance().getToken()-Methode token zurück.

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

Nach Dok

Migrieren einer GCM-Client-App nach FCM

onTokenRefresh()

wird nur aufgerufen, wenn das InstanceID-Token aktualisiert wird

Es wird also nur beim ersten Aufruf aufgerufen, wenn Sie eine App auf Ihrem Gerät installieren.

Ich empfehle Ihnen, Ihre App manuell zu deinstallieren und erneut auszuführen 

definitiv erhalten Sie TOKEN 

13
Gaurav

Versuche dies. Warum verwenden Sie RegistrationIntentService?

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

    private void registerToken(String token) {

    }
}
8
FireUser

Diese Zeile sollte das FCM-Token der Firebase erhalten. 

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

Log.d, um es auf dem Android-Monitor auszudrucken.

8
Alphonsus Chen

An Stelle von:

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

Mach das:

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

Und noch etwas:

Sie müssen die sendRegistrationToServer()-Methode aufrufen welches das Token auf dem Server aktualisiert, wenn Sie Push .__ senden. Benachrichtigungen vom Server.

UPDATE:

Ein neues Firebase-Token wird generiert (onTokenRefresh() wird aufgerufen), wenn:

  • Die App löscht die Instanz-ID
  • Die App wird auf einem neuen Gerät wiederhergestellt
  • Der Benutzer deinstalliert/installiert die App neu
  • Der Benutzer löscht die App-Daten.
7
activesince93

Das Team hinter Firebase Android SDK ändert die API etwas. Ich habe die "Token to Server" -Logik wie folgt implementiert:

In meiner Instanz von FirebaseMessagingService:

public class FirebaseCloudMessagingService extends FirebaseMessagingService {

    ...

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

    ...

}

Beachten Sie, dass das Token pro Gerät ist und von Firebase unabhängig von Ihrer Anmeldelogik aktualisiert werden kann. Wenn Sie also über die Funktion zum Anmelden und Abmelden verfügen, müssen Sie zusätzliche Fälle berücksichtigen:

  1. Wenn sich ein neuer Benutzer anmeldet, müssen Sie das Token an einen neuen Benutzer binden (an den Server senden). Das Token wird möglicherweise während der Sitzung des alten Benutzers aktualisiert, und der Server kennt das Token des neuen Benutzers nicht.
  2. Wenn sich ein Benutzer abmeldet, müssen Sie das Token aufheben. Der Benutzer sollte keine Benachrichtigungen/Nachrichten mehr erhalten.

Mit der neuen API können Sie das Token folgendermaßen erhalten:

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

Viel Glück!

7
rzaaeeff

Vergessen Sie nicht, dies in Ihre Manifestdatei aufzunehmen, um die Token-ID zu erhalten

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

Wenn Sie eine Auth-Funktion von Firebase verwenden, können Sie das Token folgendermaßen verwenden:

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

Funktioniert gut, wenn Benutzer angemeldet sind. getCurrentUser ()

3
Diego Venâncio

In firebase-messaging:17.1.0 und neuer ist der FirebaseInstanceIdService veraltet. Sie können die onNewToken für die FirebaseMessagingService-Klasse abrufen, wie unter https://stackoverflow.com/a/51475096/1351469 beschrieben.

Wenn Sie das Token jedoch jederzeit abrufen möchten, können Sie es jetzt wie folgt tun:

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

versuche dies

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

für diejenigen, die hier landen, ist FirebaseInstanceIdService jetzt veraltet.

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

und deklarieren Sie in AndroidManifest

<application... >

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

Sie können in Firebase (FCM) Folgendes verwenden, um das Token abzurufen:

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

getToken () ist veraltet. Sie können stattdessen getInstanceId () verwenden.

Wenn Sie beim Anfordern von instanceId (Token) Ergebnisse behandeln möchten, überprüfen Sie diesen 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