webentwicklung-frage-antwort-db.com.de

Umgang mit FirebaseInstanceId.getInstance (). GetToken () = null

Ich bin gerade zu FCM gewandert. Ich habe meine Klasse hinzugefügt, die sich von FirebaseInstanceIdService erstreckt, um gegebenenfalls ein RefreshToken zu erhalten.

Meine Frage ist spezifisch für den Fall, dass der Nutzer meine App zum ersten Mal installiert und aus irgendeinem Grund keine Registrierungs-ID von onTokenRefresh erhalten kann. Wie sollen wir damit umgehen? Kann ich einen Broadcast-Empfänger aus meiner FirebaseInstanceIdService-Klasse einrichten, der die Main-Aktivität benachrichtigt, wenn eine Registrierungs-ID empfangen wird?

15
Lucky
  • wenn Ihr Gerät keine Verbindung zum Internet hat onTokenRefresh () wird nie aufgerufen, und Sie sollten den Benutzer darüber informieren, dass sein Gerät keine Internetverbindung hat
  • firebase hat einen eigenen Netzwerkänderungslistener. Wenn ein mit dem Internet verbundenes Gerät versucht, ein Token abzurufen und zurückzugeben, können Sie zu diesem Zeitpunkt Ihrer Hauptaktivität durch Senden eines lokalen Rundfunkempfängers mitteilen, dass das Registrierungstoken empfangen wurde.

verwenden Sie die folgenden Codes:

    @Override
public void onTokenRefresh() {

    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();

    Log.d("FCN TOKEN GET", "Refreshed token: " + refreshedToken);

    final Intent intent = new Intent("tokenReceiver");
    // You can also include some extra data.
    final LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this);
    intent.putExtra("token",refreshedToken);
    broadcastManager.sendBroadcast(intent);


}

in Ihrer Haupttätigkeit:

    public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
   LocalBroadcastManager.getInstance(this).registerReceiver(tokenReceiver,
            new IntentFilter("tokenReceiver"));

}

BroadcastReceiver tokenReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String token = intent.getStringExtra("token");
        if(token != null)
        {
            //send token to your server or what you want to do
        }

    }
};

}
18
Edalat Feizi

Ändern Sie dies in der Datei manifest.xmltools:node="replace " Intools:node="merge".

7
Azeez

Soweit ich weiß, ist das Token nur null, wenn Sie versuchen, Ihre App auf einem Emulator auszuführen, auf dem der Google Play-Dienst nicht vorhanden ist, und wenn Sie die doppelte E-Mail-ID für den Google Play Store (auf Ihrem tatsächlichen Gerät) verwenden, jedoch nur Eine E-Mail-ID wird für die Verwendung überprüft. In diesen Fällen erhalten Sie ein Null-Token, und ich habe FCM bereits in meinem neuen Projekt implementiert. Für den Rest aller Fälle ist das Token also nicht null.

6
Mrugesh Thaker

Ich hatte das gleiche Problem. Ich habe viele SO - Posts und andere Foren durchgesehen und eine Lösung gefunden, die für mich funktionierte. In der FCM-Dokumentation heißt es, diese Methode zu verwenden, um ein Token abzurufen.

String refreshedToken = FirebaseInstanceId.getInstance().getToken();

Ich habe online einen Beitrag gefunden (ich entschuldige mich, ich weiß nicht mehr, welcher. Ich habe ihn vor einiger Zeit gefunden), der stattdessen diese Methode verwendet hat:

String refreshedToken = FirebaseInstanceId.getInstance().getToken() (String authorizedEntity, String scope);

Die FCM-Dokumentation beschreibt die erste Methode als:

Geben Sie das Master-Token für das Firebase-Standardprojekt zurück.

Während der zweite als beschrieben wird:

Gibt ein Token zurück, das eine Entität dazu berechtigt, eine Aktion im Namen der Anwendung auszuführen, die durch die Instanz-ID ..__ identifiziert wird. Dies ist ähnlich einem OAuth2-Token, außer dass es sich auf die Anwendungsinstanz anstelle eines Benutzers bezieht. Um beispielsweise ein Token zu erhalten, das zum Senden von Nachrichten an eine Anwendung über FirebaseMessaging verwendet werden kann, legen Sie die Absender-ID und "FCM" fest.

Ich habe untersucht, warum der erste Methodenaufruf länger dauert, bis ein Token zurückgegeben wird, aber ich habe noch keine Antwort gefunden. Hoffe das hilft.

3
Marline

Verwenden Sie diese Klasse erweitert mit ..

public class MyFirebaseInstanceIDService  extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";
    public static final String REGISTRATION_SUCCESS = "RegistrationSuccess";


    @Override
    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);

        Toast.makeText(MyFirebaseInstanceIDService.this,refreshedToken,Toast.LENGTH_LONG).show();
    }
}
1
Munna Sharma

abhängig von Ihrer Anwendungslogik können Sie den Code schreiben, um das "neue" Token direkt in der FirebaseInstanceIdService.onTokenRefresh()-Methode zu verarbeiten, oder Sie können LocalBroadcast verwenden, um diese Informationen an Ihre Aktivität zu senden, wenn Sie die Benutzeroberfläche ändern müssen, wenn dieses Ereignis auftritt.

Beachten Sie, dass beim Aufruf von onTokenRefresh() Ihre Aktivität geschlossen werden könnte.

Eine mögliche Implementierung könnte eine Kombination der beiden Optionen sein:

  1. fügen Sie eine Logik in onTokenRefresh() hinzu, um das Token an Ihren Server zu senden
  2. verwenden Sie einen LocalBroadcastReceiver, um Ihre Aktivität zu informieren, wenn Sie eine Benutzeroberfläche haben, die geändert werden muss, wenn das Token verfügbar ist.
1
Diego Giorgini

Wenn Sie es auf Ihrem Emulator ausführen, überprüfen Sie, ob die Google Play-Dienste unter Extras -> Android -> SDK-Manager -> SDK-Tools -> Google Play-Dienste aktiviert sind

Starten Sie nach der Installation sowohl Android Studio als auch Ihren Emulator neu

Es hat für mich funktioniert

0
SimoZuzu