web-dev-qa-db-fra.com

Firebase onTokenRefresh () n'est pas appelé

Dans mon MainActivitydans mon journal, je peux voir le jeton à l'aide de FirebaseInstanceId.getInstance().getToken() et afficher le jeton généré. Mais il semble que dans mon MyFirebaseInstanceIDService où il est étendu à FirebaseInstanceIdService, la onTokenRefresh() ne soit pas appelée, où dans cette fonction il a été dit que le jeton est initialement généré ici. J'avais besoin d'appeler sendRegistrationToServer() c'est pourquoi j'essaie de savoir pourquoi cela ne va pas dans la onTokenRefresh().

Voici mon code

public class MyFirebaseInstanceIDService  extends FirebaseInstanceIdService {


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

        sendRegistrationToServer(refreshedToken);
    }
}
69
natsumiyu

onTokenRefresh dans FirebaseInstanceIdService est appelé uniquement lorsqu'un nouveau jeton est généré. Si votre application a déjà été installée et a généré un jeton, onTokenRefresh ne sera pas appelé. Essayez de désinstaller et de réinstaller l'application pour forcer la génération d'un nouveau jeton. Cela entraînerait l'appel de onTokenRefresh.

Assurez-vous également que votre FirebaseInstanceIdService est correctement défini dans votre AndroidManifest.xml.

Dans votre fichier manifeste.

 <service
        Android:name="com.bnt.etailers.fcm.MyFireBaseInstanceIDService"
        Android:exported="false">
        <intent-filter>
            <action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

    <service
        Android:name="com.bnt.etailers.fcm.GCMNotificationIntentService"
        Android:exported="false">
        <intent-filter>
            <action Android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

Classe FirebaseInstanceIdService

public class MyFireBaseInstanceIDService extends FirebaseInstanceIdService {


private static final String TAG = MyFireBaseInstanceIDService.class.getSimpleName();

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

    if (refreshedToken!=null) {
        SettingPreferences.setStringValueInPref(this, SettingPreferences.REG_ID, refreshedToken);
    }
    // TODO: Implement this method to send any registration to your app's servers.
    sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]

/**
 * Persist token to third-party servers.
 *
 * Modify this method to associate the user's FCM InstanceID token with any server-side account
 * maintained by your application.
 *
 * @param token The new token.
 */
private void sendRegistrationToServer(String token) {
    // Add custom implementation, as needed.
}}

FirebaseMessagingService.

public class GCMNotificationIntentService extends FirebaseMessagingService {
// Sets an ID for the notification, so it can be updated


public GCMNotificationIntentService() {
    super();
}


@Override
public void onMessageReceived(RemoteMessage message) {

}}
101
Sagar Gangawane

J'ai eu le même problème que toi. Mon erreur est la suivante: j'ai placé mes balises <service> en dehors de la balise <application> dans le fichier AndroidManifest.xml.

Maintenant le mien ressemble à ceci:

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">

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

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

Et cela fonctionne sans aucun problème.

23
viplezer

Oui, cela peut arriver parfois.

Veuillez appeler la méthode suivante où vous voulez obtenir votre identifiant fcm.

    try {
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
            Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
        } catch (Exception e) {
            e.printStackTrace();
        }
14
Surendar D

Essayez de réinstaller l'application en la désinstallant d'abord de votre appareil ou de votre émulateur. Il générera alors un nouveau jeton, ainsi onTokenRefresh () sera appelé à nouveau.

13
faruk

Dans mon cas, j'ai oublié d'ajouter la permission Internet dans le manifeste,

<uses-permission Android:name="Android.permission.INTERNET" />

J'espère que la plupart des gens ne feront pas cette erreur.

13
Sreedhu Madhu

Assurez-vous d'avoir ajouté

appliquer le plugin: 'com.google.gms.google-services'

ceci au bas du fichier app.gradle

4
user2837615
try {
    FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
    e.printStackTrace();
}

dans onCreate méthode pour supprimer le jeton.

4
pru

Réinstaller a fait le tour pour moi!

3
Sterling Diaz

J'ai constaté que MyFirebaseInstanceIDService n'est pas appelé lorsque vous exécutez votre application sur un périphérique où la connectivité Internet n'est pas disponible. De cette façon, onTokenRefresh () n'est pas appelé. Assurez-vous donc que votre appareil doit disposer d'une connexion Internet lors de l'exécution de votre application pour pouvoir prendre à jour FirebaseToken.

Désinstallez également l’application précédente & Re-Install pour prendre le jeton mis à jour. Le jeton d'enregistrement change lorsque:

1) L'application supprime l'ID d'instance

2) L'application est restaurée sur un nouvel appareil

3) l'utilisateur désinstalle/réinstalle l'application

4) L'utilisateur efface les données de l'application.

3
Sheharyar Ejaz

Dans mon cas, j'ai tout essayé mais onTokenRefresh n’a jamais été appelé. Ensuite, je change de WiFi et je me connecte à différents résea, maintenant cela a fonctionné !!. Le WiFi précédent a une bonne connectivité Internet, je ne sais pas pourquoi. Peut-être que cela peut aider quelqu'un.

3

Il y a plusieurs raisons de ne pas appeler le methon onTokenRefresh non appelé. Je l'ai énuméré et le mentionne un par un.

  1. S'il vous plaît assurez-vous que vous avez ajouté la permission Internet

  2. vérifiez que vous avez ajouté le fichier google-services.json généré à partir de la console Google dans le répertoire app de votre projet.

enter image description here

  1. Dans votre fichier de module Gradle (généralement app/build.gradle), ajoutez la ligne de plug-in apply au bas du fichier pour activer le plug-in Gradle:
apply plugin: 'com.Android.application'

Android {
  // ...
}

dependencies {
  // ...
  implementation 'com.google.firebase:firebase-core:16.0.4'

  // Getting a "Could not find" error? Make sure you have
  // added the Google maven respository to your root build.gradle
}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

4) ajouter le chemin de classe de service de lecture dans le fichier build.gridle au niveau du projet

buildscript {
    // ...
    dependencies {
        // ...
        classpath 'com.google.gms:google-services:4.1.0' // google-services plugin
    }
}

allprojects {
    // ...
    repositories {
        // ...
        google() // Google's Maven repository
    }
}

5) Assurez-vous que vous avez ajouté ce service dans le fichier AndroidManifes dans la balise d'application.

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

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

6) OnToken refresh est appelé lors de l'actualisation du jeton et de la première installation de l'application. Assurez-vous donc d'avoir supprimé l'application manuellement ou effacez les données.

7) Assurez-vous d’avoir étendu le FirebaseMessagingService dans votre classe de service.

[ Remarque : Si sa version ne fonctionne pas uniquement pour une version spécifique, par exemple Android version KitKat, essayez de modifier la version de fcm.]

3
Hoque MD Zahidul

Cela fait plus d’une heure que je me bats avec cela, puis j’ai modifié le code suivant et cela a soudainement fonctionné.

manipulez votre régénéré comme tel:

String refreshedToken;
    try {
        refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);
        Localytics.setPushRegistrationId(refreshedToken);
    } catch (Exception e) {
        Log.d(TAG, "Refreshed token, catch: " + e.toString());
        e.printStackTrace();
    }

Essayez d’ajouter Android: installed = "true"> à MyFirebaseMessagingService et à MyFirebaseInstanceIDService dans le fichier manifest, de sorte qu’il se présente comme suit:

<service
        Android:name="com.localytics.Android.sample.fcm.MyFirebaseMessagingService"
        Android:exported="true">
        <intent-filter>
            <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

    <service
        Android:name="com.localytics.Android.sample.fcm.MyFirebaseInstanceIDService"
        Android:exported="true">
        <intent-filter>
            <action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

Désinstallez votre application, installez à nouveau, a travaillé. Testé sur un appareil réel.

Android: exports = "true" est une option par défaut, vous pouvez donc également le supprimer entièrement. Il sera défini sur true.

De plus, si vous souhaitez appeler onTokenRefresh plus explicitement, vous pouvez simplement appeler cela n'importe où dans votre code:

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

Vous n'êtes plus obligé de compter sur la diffusion

2
danjar

J'ai eu le même problème. Mon périphérique(KitKat 4.4.2) ne peut pas obtenir onTokenRefresh() pour une raison quelconque. Ma connexion Internet était parfaite, les services de Google Play étaient à jour et toutes les conditions nécessaires au bon fonctionnement de firebase étaient réunies. Mon code fonctionnait parfaitement sur les appareils 5.0.0 et supérieurs. Pour résoudre ce problème, j'ai dû réinitialiser mon appareil aux paramètres d'usine et l'application a commencé à fonctionner. Je sais que c'est une mesure difficile, mais peut-être que cela peut aider quelqu'un. Il doit y avoir des problèmes ou des conflits avec d'autres applications, ce qui a empêché onTokenRefresh() de s'appeler. Bonne chance!

2
Valiyor Irismetov