【问题标题】:Firebase onTokenRefresh() is not calledFirebase onTokenRefresh() 未被调用
【发布时间】:2016-09-23 21:35:22
【问题描述】:

在我的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);
    }
}

【问题讨论】:

标签: android firebase firebase-cloud-messaging firebase-notifications


【解决方案1】:

仅在生成新令牌时调用 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) {

}}

【讨论】:

  • 文档似乎令人困惑(firebase.google.com/docs/cloud-messaging/android/client),它说注册令牌可能会在以下情况发生变化:应用程序删除实例 ID,如果我手动调用 FirebaseInstanceId.getInstance().deleteInstanceId();我期待生成一个新的令牌,但在这种情况下实际上没有发生任何事情,永远不会调用 onTokenRefresh。
  • 为什么要将令牌保存到共享首选项 - 如果您可以随时致电 FirebaseInstanceId.getInstance().getToken() 获取其价值?
  • @WenChao 确保你通过InstanceID.getInstance(this).deleteInstanceID()调用playservice的InstanceID并从后台线程调用它,删除成功后调用InstanceID.getInstance(this).getID()生成新的token
  • @Alexander Farber,这是因为您只能获得一次令牌,您需要将其持久化以供以后使用。例如,我正在做一个不需要用户注册的应用程序,但他想订阅某些更新,他可以注册,我可以发送他设备的令牌和他的数据,但如果我会得到他第一次安装应用程序时的令牌,这是不可能的。
  • 我正在kitkat 上的kitkat and above 设备上测试它onTokenRefresh 方法未触发FCM version 11.6.2
【解决方案2】:

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

现在我的看起来像这样:

<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 吗?......因为我正在尝试这样做并且我得到了一个非常大的令牌
  • 脸书?火力基地?您在 FirebaseInstanceIDService 子类的 onTokenRefresh 方法中获得 Firebase 云消息传递的令牌,是的,它是一个长字符串,我的令牌是 152 个字符长。
  • 这是我的解决方案。
  • @viplezer 在我的KITKAT 上无法使token 高于其工作。请帮忙
【解决方案3】:

是的,这有时会发生。

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

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

【讨论】:

  • 好一个。重新安装几次后,令牌停止刷新,但直接 getToken 确实返回了正确的令牌。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    在我的情况下,我忘记在清单中添加互联网权限,

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

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

    【讨论】:

      【解决方案6】:
      try {
          FirebaseInstanceId.getInstance().deleteInstanceId();
      } catch (IOException e) {
          e.printStackTrace();
      }
      

      onCreate方法中删除token。

      【讨论】:

      • Thread t = new Thread() 将解决MAIN_THREAD Exception
      【解决方案7】:

      重新安装对我有用!

      【讨论】:

        【解决方案8】:

        确保你已经添加了

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

        这个到 app.gradle 文件的底部

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

            同时卸载以前的应用程序并重新安装它以获取更新的令牌。 注册令牌更改时:

            1) 应用删除Instance ID

            2) 应用在新设备上恢复

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

            4) 用户清除应用数据。

            【讨论】:

              【解决方案11】:

              我已经为此苦苦挣扎了一个多小时,然后我更改了以下代码,它突然起作用了。

              这样处理您的 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”。是哪个?
              • 对不起,已更新和扩展,感谢您指出这一点
              【解决方案12】:

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

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

              2. 检查您是否已将 google-services.json 文件添加到您的项目的 app 目录中,该文件是从 google 控制台生成的

              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 版本。]

              【讨论】:

              • 在 kitkat 设备上无法获取 token FirebaseInstanceId: Token retrieval failed: SERVICE_NOT_AVAILABLE
              • 你检查过我在这里提到的所有 avobe 问题吗?
              • 是的,仅在 kitkat 设备上它不能在 kitkat 之上工作休息它的工作我的 FCM 版本是 11.6.2
              • FCM 版本更改为10.2.1 对我有用,我的targetSdkVersion 是27,最小值是16
              【解决方案13】:

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

              【讨论】:

                猜你喜欢
                • 2016-09-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多