Firebase onTokenRefresh()不被调用


72

在我MainActivity的日志中,我可以看到令牌的使用FirebaseInstanceId.getInstance().getToken()并显示生成的令牌。但是似乎在我 MyFirebaseInstanceIDService将其扩展到的地方FirebaseInstanceIdServiceonTokenRefresh()未调用,在此函数中据说令牌是在此处最初生成的。我需要打电话给我,sendRegistrationToServer()这就是为什么我试图知道为什么它没有出现在其中的原因onTokenRefresh()

这是我的代码

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


2
请完整阅读问题。该问题与您提到的问题不重复。@Machado
Wijay Sharma

Answers:


106

仅当生成新令牌时才调用FirebaseInstanceIdService中的onTokenRefresh。如果您的应用先前已安装并生成令牌,则不会调用onTokenRefresh。尝试卸载并重新安装该应用程序以强制生成新令牌,这将导致调用onTokenRefresh。

另外,请确保在AndroidManifest.xml中正确定义了FirebaseInstanceIdService

在清单文件中。

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

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

}}

1
该文档似乎令人困惑(firebase.google.com/docs/cloud-messaging/android/client),它说注册令牌可能在以下情况下更改:该应用删除实例ID,如果我手动调用FirebaseInstanceId.getInstance()。deleteInstanceId( ); 我期望生成一个新令牌,但是在这种情况下实际上什么也没有发生,因此从不调用onTokenRefresh。
超'16

2
为什么要将令牌保存到共享的首选项中-如果您可以随时调用FirebaseInstanceId.getInstance()。getToken()来获取其值?
亚历山大·法伯

@WenChao确保您通过InstanceID.getInstance(this).deleteInstanceID()调用playservice的InstanceID并从后台线程中调用它,在您成功删除它之后,调用InstanceID.getInstance(this).getID()以生成新令牌
Salis

@Alexander Farber,这是因为您只能获得一次令牌,因此需要保留它以备后用。例如,我正在做一个不需要注册用户的应用程序,但是他想要订阅某些更新,他可以注册,我可以将他的设备的令牌与他的数据一起发送,但是如果我可以首次安装应用程序时无法使用令牌。
斯特林·迪亚兹

我正在kitkat and above设备上测试它kitkat onTokenRefresh不会触发方法FCM version 11.6.2
Sagar

23

我和你一样有同样的问题。我的错误如下:我将<service>标签放置<application>在AndroidManifest.xml文件中的标签之外。

现在我的看起来像这样:

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

它可以正常工作。



很好的答案...这是返回的Facebook ID吗?.....因为我正在尝试这样做,并且我得到了一个非常大的令牌
Juan Juan

Facebook的?火力基地?您在FirebaseInstanceIDService子类的onTokenRefresh方法中获得了Firebase Cloud Messaging的令牌,是的,它是一个长字符串,我的令牌是152个字符长。
viplezer '16

这是我的解决方案。
jet_choong

@viplezer对我KITKAT无法token超越其工作。请帮助
Sagar

15

是的,这可能会发生几次。

如果您想获取fcm id,请致电以下方法。

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

2
好一个 几次重新安装后,令牌停止刷新,但直接getToken确实返回了正确的令牌。
Vitaliy

14

尝试重新安装该应用程序,方法是先从设备或仿真器中将其卸载。然后它将生成一个新令牌,因此onTokenRefresh()将再次被调用。



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

onCreate删除令牌的方法中。


Thread t = new Thread()将解决MAIN_THREAD Exception
Pierre


4

确保您已添加

应用插件:“ com.google.gms.google-services”

这到app.gradle文件的底部


3

就我而言,我尝试了一切,但从onTokenRefresh未被召集。然后我更改了WiFi,然后连接到其他网络,现在可以正常使用了!!以前的WiFi具有良好的互联网连接能力,不知道为什么会这样。也许这可以帮助某人。


3

我遇到了在没有Internet连接的设备上运行应用程序时未调用MyFirebaseInstanceIDService的情况。这样,不会调用onTokenRefresh()。因此,在运行应用程序以获取更新的FirebaseToken时,请确保您的设备必须具有互联网连接。

还要卸载以前的应用并重新安装以获取更新的令牌。在以下情况下,注册令牌更改:

1)该应用删除实例ID

2)该应用程序已在新设备上还原

3)用户卸载/重新安装应用程序

4)用户清除应用程序数据。


3

我一直在努力奋斗了一个多小时,然后我更改了以下代码,然后突然起作用了。

这样处理您的refreshedToken:

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

尝试将android:exported =“ true”>添加到清单中的MyFirebaseMessagingService和MyFirebaseInstanceIDService中,如下所示:

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

卸载您的应用程序,再次安装成功。在真实设备上测试。

android:exported =“ true”是默认选项,因此您也可以将其完全删除,并将其设置为true。

另外,如果您想更明确地调用onTokenRefresh,则可以在代码中的任何位置简单地调用它:

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

您不必再依赖广播了


您说“ android:exported = true”,但是代码示例显示“ android:exported = false”。哪有
马特·麦克

对不起,更新和扩展的人,谢谢你指出这一点
danjar '18

3

不调用onTokenRefresh methon的原因有很多。我已列出并逐一提及。

  1. 请确保您已添加互联网许可

  2. 检查您是否在项目中的应用程序目录内添加了从google控制台生成的google-services.json文件

在此处输入图片说明

  1. 在模块Gradle文件(通常是app / build.gradle)中,在文件底部添加apply插件行以启用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)在项目级别的build.gridle文件中添加播放服务类路径

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

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

5)确保已在应用程序标签内的AndroidManifes文件中添加了这些服务

<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,因此请确保您已手动删除了该应用程序或清除了数据

7)确保已在服务类中扩展了FirebaseMessagingService

[注意:如果它不适用于特定版本,例如android kitkat版本,请尝试更改fcm版本。


在kitkat设备上无法获取token FirebaseInstanceId: Token retrieval failed: SERVICE_NOT_AVAILABLE
Sagar

您是否检查了我在这里提到的所有avobe问题?
Hoque MD Zahidul

是的,仅在kitkat设备上无法正常工作,高于kitkat,我的FCM版本是11.6.2
Sagar

更改FCM版本10.2.1以为我工作,我的targetSdkVersion27至少是16
Sagar

2

我有同样的问题。我的设备由于某种原因(kitkat 4.4.2)无法使用onTokenRefresh()。我的互联网连接非常完美,Google Play服务是最新的,满足了Firebase正常工作的所有必要条件。我的代码在设备5.0.0及更高版本上完美运行。为了解决此问题,我不得不将设备重置为出厂设置,并且应用程序开始工作。我知道这是一个艰难的措施,但也许可以对某人有所帮助。必须存在一些问题或与其他应用程序发生冲突,导致onTokenRefresh()无法调用。祝好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.