不调用 TokenRefresh()上的 Firebase

在我的日志中的 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);
}
}
73026 次浏览

我和你有同样的问题。我的错误如下: 我将 <service>标记放在 AndroidManifest.xml 文件中的 <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>

而且没有任何问题。

只有在生成新令牌时才调用 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>

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


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

onCreate方法中删除标记。

是的,这种情况有时会发生。

请调用以下方法以获取 fcm id。

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

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

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

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

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

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

重新安装对我来说很有用!

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

也卸载以前的应用程序和 重新安装它采取更新令牌。 注册标记在以下情况下更改:

1)应用程序删除实例 ID

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

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

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

我已经纠结了一个多小时了,然后我改了下面的代码,它突然起作用了。

这样处理刷新后的令牌:

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: export = “ 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>

卸载你的应用程序,再次安装,工作。在真正的设备上测试。

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

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

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

你不必再依赖于广播被接收了

确保您已经添加了

应用插件: ‘ com.google.gms.google-services’

这是 app.gradle 文件的底部

我也有同样的问题。由于某种原因,我的设备 (kitkat 4.4.2)无法获得 onTokenRefresh()。我的互联网连接是完美的,谷歌播放服务是最新的和所有必要的条件,为消防工作得到满足。我的代码在 5.0.0及以上的设备上运行良好。为了解决这个问题,我必须重置我的设备工厂设置和应用程序开始工作。我知道这很难接受,但也许能帮到别人。肯定有一些问题或与其他应用程序冲突,导致 onTokenRefresh()不能被调用。祝你好运!

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

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

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

enter image description here

  1. 在你的 Gradle 模块文件(通常是 app/build.Gradle)中,在文件底部添加 application 插件行,以启用 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 刷新在令牌刷新和第一次安装应用程序时被调用,所以请确保您已经手动删除了应用程序或清除了数据

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

[ 注意: 如果它不工作只为特定的版本,例如 android kitkat 版本,然后尝试改变 fcm 版本。]