Firebase onTokenRefresh() is not called

后端 未结 13 2068
天命终不由人
天命终不由人 2020-11-27 16:59

In my MainActivityin my log, I can see the token using FirebaseInstanceId.getInstance().getToken() and it display the generated token. But it seem

相关标签:
13条回答
  • 2020-11-27 17:26

    I had the same problem. My device(kitkat 4.4.2) couldn't get onTokenRefresh() for some reason. My internet connection was perfect, google play services was up to date and all necessary contiditions for firebase to work were met. My code worked perfectly on the devices 5.0.0 and higher. To solve this issue i had to reset my device to factory settings and application started to work. I know it's tough measure but maybe it may help somebody. There must be some problems or conflict with other application, which caused onTokenRefresh() not to be called. Good luck!

    0 讨论(0)
  • 2020-11-27 17:27

    There are several reasons to not calling the onTokenRefresh methon not called. I have listed that and mention it one by one .

    1. Please make sure you have added the internet permission

    2. check have you added the google-services.json file that generate from google console inside of app directory in your project

    1. In your module Gradle file (usually the app/build.gradle), add the apply plugin line at the bottom of the file to enable the Gradle plugin:
    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) add the play service class path in project level build.gridle file

    buildscript {
        // ...
        dependencies {
            // ...
            classpath 'com.google.gms:google-services:4.1.0' // google-services plugin
        }
    }
    
    allprojects {
        // ...
        repositories {
            // ...
            google() // Google's Maven repository
        }
    }
    

    5) Make sure you have added those service in the AndroidManifes file inside application tag

    <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 is called when token refresh and when install the app for the first so make sure you have deleted the app manually or clear the data

    7) Make sure you have extends the FirebaseMessagingService in your service class

    [Note : If its not working only for specific version for example android kitkat version then try to change the fcm version.]

    0 讨论(0)
  • 2020-11-27 17:28

    I have experienced that MyFirebaseInstanceIDService is not called when you are running your application on a device where internet connectivity is not available. In this way onTokenRefresh() is not called. So make sure that your device must has internet connection during running your application for taking updated FirebaseToken.

    Also uninstall the previous app & Re-Install it for taking updated token. The registration token change when:

    1) The app deletes Instance ID

    2) The app is restored on a new device

    3) The user uninstalls/reinstall the app

    4) The user clears app data.

    0 讨论(0)
  • 2020-11-27 17:29

    In my case, I tried everything but onTokenRefresh was never called. Then I change my WiFi and I connect to different network, Now it worked!!. Previous WiFi has good internet connectivity, Don't know why it was happening. May be this can help someone.

    0 讨论(0)
  • 2020-11-27 17:33
    try {
        FirebaseInstanceId.getInstance().deleteInstanceId();
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    in onCreate method to delete token.

    0 讨论(0)
  • 2020-11-27 17:39

    onTokenRefresh in FirebaseInstanceIdService is only called when a new token is generated. If your app was previously installed and generated a token then onTokenRefresh would not be called. Try uninstalling and reinstalling the app to force the generation of a new token, this would cause onTokenRefresh to be called.

    Also be sure that your FirebaseInstanceIdService is properly defined in your AndroidManifest.xml

    In your Manifest File.

     <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>
    

    FirebaseInstanceIdService class

    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 class.

    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) {
    
    }}
    
    0 讨论(0)
提交回复
热议问题