web-dev-qa-db-fra.com

Firebase Cloud Messaging n'appelant pas FirebaseInstanceId

Je viens de mettre à jour GCM à FCM conformément à ce guide ici . Le site indique que mon service, qui étend FirebaseInstanceIdService, sera appelé dès que le jeton sera généré. Pour une raison quelconque, mon service n'est jamais appelé et onTokenRefresh n'est jamais exécuté.

Mes services sont enregistrés comme ceci, selon le guide:

<service Android:name=".fcm.FcmService">
    <intent-filter>
        <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

<service Android:name=".fcm.InstanceIdService">
    <intent-filter>
        <action Android:name="com.google.firebase.INSTANCEID_EVENT"/>
    </intent-filter>
</service>

Mon service:

public class InstanceIdService extends FirebaseInstanceIdService {

    private static final String TAG = "InstanceIdService";

    @Override
    public void onTokenRefresh() {
        String token = FirebaseInstanceId.getInstance().getToken();

        Log.e(TAG, "Got token: " + token);
    }
}

Le LogCat ne dit rien sur les fichiers de configuration manquants ou autre, et je peux voir les journaux sur FirebaseApp et une entrée de journal mentionnant le jeton, mais mon service n'est toujours pas appelé.

Dois-je démarrer ce service quelque part dans mon activité? .__ Est-ce que je fais quelque chose de mal? Est-ce que quelqu'un peut me guider dans la bonne direction?

EDIT: using Log.e("TOKEN", "Token: " + FirebaseInstanceId.getInstance().getToken()); imprime correctement mon jeton, ce qui signifie qu'il a été généré avec succès. Le service n'est toujours pas appelé ...

EDIT 2: La modification de INSTANCEID_EVENT en INSTANCE_ID_EVENT a corrigé le problème, mais j'ai dû réinstaller l'application. Comme j'ai déjà publié une version bêta contenant le nouveau FCM, mes bêta-testeurs ne pourront pas s'abonner aux rubriques pour recevoir les messages entrants. Alors, comment devrais-je résoudre cela?

11
qwertz

Merci Endanke d'avoir compris cela avec moi. Il semble que la documentation de Firebase est incohérente. Une page indique que votre filtre d'intention dans votre fichier manifeste doit être INSTANCE_ID_EVENT, et un autre dit INSTANCEID_EVENT.

Vous devez utiliser INSTANCE_ID_EVENT et une fois les modifications apportées, vous devez désinstaller et réinstaller complètement votre application pour que les modifications soient prises en compte.

12
Zach Rattner

FCM devrait être utilisé en remplacement du GCM. Dans votre cas, il semblerait que votre manifeste contienne des services pour FCM et GCM. Essayez de supprimer le gcm.GcmService et utilisez uniquement celui qui étend FirebaseInstanceId.

2
Arthur Thompson

Après une tonne d'essais et d'erreurs, mon problème était d'avoir des outils: node = "replace" dans mon tag d'application ... le supprimer l'a résolu pour moi

1
jai

Ce que veut «Firebase Cloud Messaging», c'est:

  • Implémentez une classe dérivée ( MyFirebaseInstanceIdService ) à partir de FirebaseInstanceIdService .
  • Implémentez le paramètre onTokenRefresh pour gérer une mise à jour du jeton .__ pour le périphérique.
  • Dans le fichier AndroidManifest.xml, faites référence à la classe 'dérivée' précédée du préfixe .__ avec un ".".

MyFirebaseInstanceIdService est un nom 'suggéré'. Personnellement, je préfère préfixer ces classes dérivées d'un acronyme ou d'un nom que j'utilise dans l'application.

0
digitaldaemon

Vérifiez également la date de votre téléphone! J'ai eu une fois une différence de 5-7 jours! Réparer la journée et réinstaller l'application a résolu le problème!

0
Dhruv Kaushal

remplacez simplement INSTANCE_ID_EVENT par INSTANCEID_EVENT .il a fonctionné pour moi 

0
kashyap k bandi

J'ai différentes variantes de construction dans mon projet et j'ai le problème suivant:

De: https://firebase.google.com/docs/Android/setup#prerequisites

Remarque: Si vous avez défini plusieurs variantes de construction avec différents noms de package, chaque application doit être ajoutée à votre projet dans la console Firebase.

0

Assurez-vous que votre fichier Firebase "MyFirebaseInstanceIDService.Java" se trouve directement sous l’arborescence du nom de package "com.company".

Ne les mettez pas dans un sous-paquet distinct, comme "com.company.services". En effet, votre service google-services.json recherchera les fichiers directement dans le répertoire "com.company".

Ajoutez ce qui suit dans votre balise d’application de manifeste sous la balise méta (le cas échéant)

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

Vous obtiendrez votre JETON sur la méthode publique void onTokenRefresh ()

PS: Téléchargez et remplacez le dernier fichier google-services.json à partir de la console de votre projet.

0
Dhruv Kaushal

J'ai eu le même problème et en désinstallant et en réinstallant l'application sur l'appareil onTokenRefresh() on m'a appelé une fois. Donc, je suppose que cela a changé de GCM où il était souvent appelé à être appelé une seule fois, alors qu’il n’y avait pas de jeton.

0
Onno Eberhard

onTokenRefresh() appellera une seule fois. Lorsque votre application sera installée pour la première fois, si vous souhaitez accéder au jeton depuis une autre activité, vous devez appeler cette méthode:

FirebaseInstanceId.getInstanceId().getToken();
0
Mohd Qasim