72

在我MainActivity的日志中,我可以看到使用的令牌FirebaseInstanceId.getInstance().getToken()并显示生成的令牌。但它似乎在我的 MyFirebaseInstanceIDServicewhere it is extends to 中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);
    }
}
4

13 回答 13

106

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

还要确保您的 FirebaseInstanceIdService 在您的 AndroidManifest.xml 中正确定义

在您的清单文件中。

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

}}
于 2016-05-26T15:47:38.790 回答
23

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

现在我的看起来像这样:

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

它工作没有任何问题。

于 2016-05-26T13:28:58.387 回答
16

是的,这有时可能会发生。

请在您想获取 fcm id 的任何地方调用以下方法。

    try {
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
            Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
        } catch (Exception e) {
            e.printStackTrace();
        }
于 2016-11-09T05:56:46.767 回答
14

尝试重新安装该应用程序,首先从您的设备或模拟器中卸载它。然后它将生成一个新令牌,因此将再次调用 onTokenRefresh()。

于 2016-11-29T07:27:27.680 回答
13

就我而言,我忘记在清单中添加互联网权限,

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

希望大多数人不会犯这个错误。

于 2016-11-25T10:15:46.897 回答
4
try {
    FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
    e.printStackTrace();
}

onCreate删除令牌的方法中。

于 2016-10-22T07:14:06.863 回答
4

确保您已添加

应用插件:'com.google.gms.google-services'

这个到 app.gradle 文件的底部

于 2018-04-12T12:06:13.093 回答
4

重新安装对我有用!

于 2017-11-14T17:52:49.540 回答
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);

您不必再依赖接收到的广播

于 2018-03-23T17:00:25.137 回答
3

不调用未调用 onTokenRefresh 方法有几个原因。我已经列出来并一一提及。

  1. 请确保您已添加互联网权限

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

在此处输入图像描述

  1. 在您的模块 Gradle 文件(通常是 app/build.gradle)中,在文件底部添加 apply plugin 行以启用 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 版本。]

于 2018-10-26T07:52:56.993 回答
3

就我而言,我尝试了一切,但从onTokenRefresh未被调用。然后我改变了我的WiFi并连接到不同的网络,现在它工作了!!以前的 WiFi 具有良好的互联网连接,不知道为什么会这样。可能这可以帮助某人。

于 2017-08-01T13:35:19.900 回答
3

我的经验是,当您在互联网连接不可用的设备上运行应用程序时,不会调用 MyFirebaseInstanceIDService。这样就不会调用 onTokenRefresh()。因此,请确保您的设备在运行应用程序以获取更新的 FirebaseToken 期间必须具有互联网连接。

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

1) 应用删除Instance ID

2)应用程序在新设备上恢复

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

4) 用户清除应用数据。

于 2018-03-21T08:36:05.597 回答
2

我有同样的问题。我的设备由于某种原因(kitkat 4.4.2)无法获取onTokenRefresh()。我的互联网连接很完美,谷歌播放服务是最新的,并且满足了 firebase 工作的所有必要条件。我的代码在设备5.0.0及更高版本上完美运行。为了解决这个问题,我不得不将我的设备重置为出厂设置并且应用程序开始工作。我知道这是一项艰难的措施,但也许它可能会对某人有所帮助。一定是与其他应用程序有问题或冲突,导致onTokenRefresh()无法调用。祝你好运!

于 2018-04-17T13:28:18.133 回答