web-dev-qa-db-fra.com

Comment gérer FirebaseInstanceId.getInstance (). GetToken () = null

Je viens de migrer vers FCM. J'ai ajouté ma classe qui s'étend de FirebaseInstanceIdService pour recevoir un refreshedToken selon les besoins.

Ma question concerne spécifiquement le cas où l'utilisateur installe mon application pour la première fois et, pour une raison quelconque, incapable de recevoir un identifiant d'enregistrement de onTokenRefresh. Comment sommes-nous censés gérer cela? Puis-je définir un récepteur de diffusion à partir de ma classe FirebaseInstanceIdService qui notifiera l'activité principale lorsqu'un ID d'enregistrement est reçu?

15
Lucky
  • si votre appareil n'a pas de connexion Internet onTokenRefresh () n'est jamais appelé et vous devez informer l'utilisateur que son appareil n'a pas de connexion Internet
  • firebase a son propre écouteur de changement de réseau et lorsqu'un périphérique connecté à Internet tente d'obtenir un jeton et le renvoie, vous pouvez indiquer à votre activité principale en envoyant à un récepteur de diffusion locale que le jeton d'enregistrement est reçu.

utiliser les codes ci-dessous:

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


}

dans votre activité principale:

    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

Modifiez cela dans le fichier manifest.xmltools:node="replace " À tools:node="merge".

7
Azeez

Pour autant que je sache, le jeton sera nul uniquement lorsque vous essayez d'exécuter votre application sur un émulateur sur lequel le service Google Play n'est pas disponible et lorsque vous utilisez un identifiant de messagerie double sur votre Google Play Store (sur votre appareil actuel), mais uniquement un identifiant de courrier électronique est vérifié pour l'utilisation. Ce sont les cas qui vous donneront un jeton nul et j'ai déjà implémenté FCM dans mon nouveau projet. Donc, pour le reste des cas, le jeton ne sera pas nul.

6
Mrugesh Thaker

Je faisais face au même problème. J'ai parcouru beaucoup de SO posts et autres forums et j'ai trouvé une solution qui fonctionnait pour moi. La documentation de FCM recommande d'utiliser cette méthode pour obtenir un jeton.

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

J'ai trouvé un article en ligne (je m'excuse, je ne me souviens plus lequel. Je l'ai trouvé il y a longtemps) qui utilisait cette méthode à la place:

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

La documentation FCM décrit la première méthode comme suit:

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

Alors que le second est décrit comme:

Renvoie un jeton qui autorise une entité à exécuter une action pour le compte de l'application identifiée par l'ID d'instance . Ceci est similaire à un jeton OAuth2 sauf que cela s'applique à l'instance d'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-le sur "FCM".

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

3
Marline

Utilisez cette classe s'étend avec ..

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

en fonction de la logique de votre application, vous pouvez écrire le code pour gérer le "nouveau" jeton directement dans la méthode FirebaseInstanceIdService.onTokenRefresh() ou utiliser LocalBroadcast pour envoyer ces informations à votre activité si vous devez modifier l'interface utilisateur lorsque cet événement se produit.

Notez que lorsque onTokenRefresh() est appelé, votre activité peut être fermée.

Une implémentation possible pourrait combiner les deux options:

  1. ajoutez de la logique dans onTokenRefresh() pour envoyer le jeton sur votre serveur
  2. utilisez un récepteur LocalBroadcastReceiver pour informer votre activité si vous avez une partie de l'interface utilisateur qui doit être modifiée lorsque le jeton est disponible.
1
Diego Giorgini

Si vous l'exécutez sur votre émulateur, vérifiez que les services Google Play sont activés dans Outils -> Android -> Gestionnaire de SDK -> Outils SDK -> Services Google Play.

Une fois installé, redémarrez Android Studio et votre émulateur.

Ça a fonctionné pour moi

0
SimoZuzu