2016-06-15 2 views
15

J'utilise FCM pour fournir des notifications dans mon application. Tout a bien fonctionné, mais maintenant je me suis rendu compte que, lorsque j'installe mon application avec Android Studio (et non avec GooglePlay), le jeton est nul au premier lancement. Lorsque je ferme mon application et que je la redémarre, le jeton n'est plus nul. Quelles sont les causes de ce problème et comment puis-je l'éviter?Android: jeton Firebase est null au premier lancement

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

En MainActivity:

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

retours Dernière log null lorsque l'application est installé et démarré pour la première fois

script Inscription:

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

Répondre

22

Le jeton est récupéré de manière asynchrone au premier démarrage de l'application. Vous devez attendre que onTokenRefresh() soit appelé dans votre FirebaseInstanceIdService avant que le jeton soit accessible.

+0

mon doute est pourquoi nous devons appeler cela à chaque fois FirebaseMessaging.getInstance(). SubscribeToTopic ("topic"); avant d'obtenir l'instance de jeton. – Ruban

6

désinstallez l'application à partir de l'émulateur et exécutez à nouveau, de sorte que la méthode onTokenRefreshed sera appelée à nouveau.

Pour vérifier wether vous êtes déjà inscrit et que vous voulez juste savoir la FCM Jeton

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

ajoutez la ligne ci-dessus en classe MyFirebaseMessagingService ne importe où (dans la méthode oncreate) et juste Toast ou connectez-vous le refreshedToken.

2

Même moi j'avais le même problème. J'avais donné l'instruction Log pour imprimer le token dans onCrée de mon activité de lancement. Il faut du temps pour actualiser le jeton une fois que vous avez désinstallé l'application. C'est pourquoi vous obtenez null. Vous devez attendre un peu pour que le jeton soit actualisé.

0

Je viens de tomber dans le même numéro et c'est ainsi que je l'ai réparé. Appelez le bloc quelque part dans onCreate() méthode de votre activité. Je souhaite envoyer le jeton à mon serveur Parse, vous devez donc le modifier en fonction de vos besoins.

This is l'échantillon que j'ai suivi.

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

Je faisais face au même problème. J'ai regardé à travers de nombreux messages et d'autres forums et j'ai trouvé une solution qui a fonctionné pour moi. La documentation FCM dit d'utiliser cette méthode pour obtenir un jeton.

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

J'ai trouvé un en ligne de poste (je présente mes excuses, je ne me souviens pas que l'on je l'ai trouvé tout à l'heure.) Qui a utilisé cette méthode à la place:

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

documentation FCM décrit la première méthode as:

Renvoie le jeton principal pour le projet Firebase par défaut.

Alors que le second est décrit comme:

Renvoie un jeton qui autorise une entité à exécuter une action au nom de l'application identifiée par ID d'instance. Ceci est similaire à un jeton OAuth2, sauf qu'il s'applique à l'instance de l'application au lieu d'un utilisateur. Par exemple, pour obtenir un jeton pouvant être utilisé pour envoyer des messages à une application via FirebaseMessaging, définissez l'ID de l'expéditeur et définissez sur "FCM".

J'ai cherché à savoir pourquoi le premier appel de méthode prend plus de temps pour retourner un jeton, mais je n'ai pas encore trouvé de réponse. J'espère que cela t'aides.

0

Il suffit de remplacer:

String token = instanceID.getToken(); 

avec:

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

et cela fonctionnera.

+0

Qu'est-ce que $ SENDER_ID ici? –

+0

Pour obtenir FCM ID expéditeur: Ouvrez la console Firebase. Recherchez votre projet Firebase et cliquez sur Nom du projet. cliquez sur l'icône de réglage et sélectionnez le menu "Project Setting" Sélectionnez l'onglet "Could Messaging" et utilisez l'identifiant de l'expéditeur sur la page –

+0

Bonjour Alaa, je reçois l'exception ci-dessous en appelant ce live. java.io.IOException: MAIN_THREAD try { Jeton de chaîne = FirebaseInstanceId.getInstance(). getToken ("", "FCM"); int a = 0; a ++; } catch (IOException e) { e.printStackTrace(); } –

0

Le plus gros problème que je dû faire face après avoir écrit le code correct est: - pas la dernière version de Google Play Services dans la construction-gradle, donc toujours utiliser la version des services-play-google montré par firebase dans la mise en place de dialogue

+0

Est-ce vraiment une solution au problème présenté? – yakobom

+0

oui j'essayais depuis hier soir que mon code ne montre pas jeton de firebase puis je mettre à niveau mon numéro de version sur google-play-services dans build gradle maintenant son fonctionnement –