2016-06-15 11 views
15

Ich verwende FCM, um Benachrichtigungen in meiner App bereitzustellen. Alles hat gut funktioniert, aber jetzt habe ich festgestellt, dass das Token bei der ersten Installation null ist, wenn ich meine Anwendung mit Android Studio (nicht von GooglePlay) installiere. Wenn ich meine App schließe und neu starte, ist das Token nicht mehr null. Was verursacht dieses Problem und wie kann ich es vermeiden?Android: Firebase-Token ist null beim ersten Lauf

InstanceIDService:

public class InstanceIDService extends FirebaseInstanceIdService { 

    @Override 
    public void onTokenRefresh() { 

     String token = FirebaseInstanceId.getInstance().getToken(); 
     registerToken(token); 
    } 

    private void registerToken(String token) { 

     OkHttpClient client = new OkHttpClient(); 
     RequestBody body = new FormBody.Builder() 
       .add("Token",token) 
       .build(); 

     Request request = new Request.Builder() 
       .url("url_to_registration_script") 
       .post(body) 
       .build(); 

     try { 
      client.newCall(request).execute(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

In MainActivity:

FirebaseMessaging.getInstance().subscribeToTopic("topic"); 
String token = FirebaseInstanceId.getInstance().getToken(); 
Log.d("TOKEN", token); 

Letzte Log-Returns null, wenn App installiert und gestartet wird zum ersten Mal

Registrierung Skript:

<?php 
if (isset($_POST["Token"])) { 

     $_uv_Token=$_POST["Token"]; 
     $conn = mysqli_connect("localhost","user","pass","db") or die("Error connecting"); 
     $q="INSERT INTO users (Token) VALUES ('$_uv_Token') " 
      ." ON DUPLICATE KEY UPDATE Token = '$_uv_Token';"; 

    mysqli_query($conn,$q) or die(mysqli_error($conn)); 
    mysqli_close($conn); 
} 
?> 

Antwort

22

Das Token wird beim ersten Start der App asynchron abgerufen. Sie müssen warten, bis onTokenRefresh() in Ihrem FirebaseInstanceIdService aufgerufen wird, bevor auf den Token zugegriffen werden kann.

+0

Mein Zweifel ist, warum wir dies jedes Mal aufrufen müssen FirebaseMessaging.getInstance(). SubscribeToTopic ("topic"); bevor Token-Instanz abgerufen wird. – Ruban

6

Die App vom Emulator deinstallieren und erneut ausführen, damit die onTokenRefreshed-Methode erneut aufgerufen wird.

Um zu überprüfen, ob Sie bereits registriert sind und Sie wollen einfach nur

die FCM-Token wissen
String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

fügen Sie die obige Zeile in MyFirebaseMessagingService Klasse, wo jeder (in oncreate-Methode) und nur Toast oder die refreshedToken loggt sein.

2

Sogar ich hatte das gleiche Problem. Ich hatte die Log-Anweisung gegeben, um das Token in onCreate meiner Launcher-Aktivität zu drucken. Nach dem Deinstallieren der App dauert es einige Zeit, das Token zu aktualisieren. Deshalb wirst du null. Sie müssen ein wenig warten, bis das Token aktualisiert ist.

0

Ich bin einfach in der gleichen Frage gefallen und das ist die Art, wie ich es behoben habe. Rufen Sie den Block irgendwo in onCreate() Methode Ihrer Aktivität. Ich möchte den Token an meinen Parse-Server senden, sodass Sie ihn entsprechend Ihren Anforderungen ändern müssen.

This is die Probe ich folgte.

private void subscribeUserToParse() { 
     String deviceToken = FirebaseInstanceId.getInstance().getToken(); 
     if (TextUtils.isEmpty(deviceToken)) { 
      Intent intent = new Intent(this, MyFirebaseInstanceIDService.class); 
      startService(intent); 
      return; 
     } 

     User user = UserUtil.retrieveUserFromDB(mRealm); 
     String objectId = user.getParseObjectId(); 
     if (!TextUtils.isEmpty(objectId)) { 
      ParseUtils.subscribeWithUsersObjectId(objectId, deviceToken); 
     } 
    } 
0

Ich war mit dem gleichen Problem konfrontiert. Ich habe viele SO-Posts und andere Foren durchgesehen und eine Lösung gefunden, die für mich funktioniert hat. FCM-Dokumentation sagt, diese Methode zu verwenden, um ein Token zu erhalten.

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

fand ich einen Beitrag online (Ich entschuldige mich, ich erinnere mich nicht, welche ich es vor einer Weile gefunden.), Die diese Methode stattdessen verwendet:

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

FCM Dokumentation beschreibt die erste Methode as:

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

während der zweite wird wie folgt beschrieben:

ein Token zurück, die einer Entität autorisiert eine Aktion im Namen der Anwendung, die von Instanz-ID identifiziert auszuführen. Dies ähnelt einem OAuth2-Token, außer dass es für die Anwendungsinstanz anstelle eines Benutzers gilt. Um beispielsweise ein Token zu erhalten, mit dem über FirebaseMessaging Nachrichten an eine Anwendung gesendet werden kann, legen Sie die Absender-ID fest und legen Sie "FCM" fest.

Ich habe mich in warum der ersten Methodenaufruf dauert eine längere Zeit, um ein Token zurück, aber ich habe noch keine Antwort gefunden. Hoffe das hilft.

0

Ersetzen Sie einfach:

String token = instanceID.getToken(); 

mit:

String token = instanceID.getToken($SENDER_ID, "FCM"); 

und es wird funktionieren.

+0

Was ist $ SENDER_ID hier? –

+0

So erhalten Sie die FCM-Absender-ID: Öffnen Sie die Firebase-Konsole. Suchen Sie Ihr Firebase-Projekt und klicken Sie auf Projektname. , um die Einstellung Symbol und wählen Sie „Projekteinstellung“ Menü Wählen Sie die Registerkarte „Could Messaging“ und Absender-ID verwenden, um auf der Seite –

+0

Hallo Alaa, ich bin unten Ausnahme immer durch diese Live-Aufruf. java.io.IOException: MAIN_THREAD try { String Token = FirebaseInstanceId.getInstance() getToken ("", "FCM");. int a = 0; a ++; } catch (IOException e) { e.printStackTrace(); } –

0

Das größte Problem, das ich konfrontierte nach dem richtigen Code zu schreiben ist: - nicht die neueste Version von Google-Service in Build-gradle spielen, Also immer die Google-Play-Dienste Version von Feuerbasis gezeigt bei der Einrichtung von Dialog

+0

Ist das wirklich eine Lösung für das Problem präsentiert? – yakobom

+0

Ja, ich war seit gestern Abend versucht, warum nicht mein Code Zeichen der Feuerbasis zeigt dann meine Version aktualisieren i Zahl auf Google-Play-Dienste in Build gradle jetzt seinen Arbeits –

Verwandte Themen