Android 发送一个通知后出现未注册令牌错误
在使用Firebase时,我的android应用程序面临着这个戏剧性的问题。 1.我的应用在第一次启动时收到令牌 2.我能够从firebase控制台向注册令牌发送通知 3.如果我在步骤2之后再次尝试使用控制台发送通知。在第二次尝试之后,它向我显示“未注册令牌” 我在清单中已经有了所有必要的配置,google service.json文件也已准备就绪,配置正确。我相信一切都是正确的,因为该应用程序能够接收一次通知,而问题只是在这之后才开始出现 更新1: 若我卸载应用程序并重新安装,那个么我也只能收到一次通知 那些想看代码的人,这是我如何获得令牌的:Android 发送一个通知后出现未注册令牌错误,android,firebase,notifications,google-cloud-messaging,firebase-cloud-messaging,Android,Firebase,Notifications,Google Cloud Messaging,Firebase Cloud Messaging,在使用Firebase时,我的android应用程序面临着这个戏剧性的问题。 1.我的应用在第一次启动时收到令牌 2.我能够从firebase控制台向注册令牌发送通知 3.如果我在步骤2之后再次尝试使用控制台发送通知。在第二次尝试之后,它向我显示“未注册令牌” 我在清单中已经有了所有必要的配置,google service.json文件也已准备就绪,配置正确。我相信一切都是正确的,因为该应用程序能够接收一次通知,而问题只是在这之后才开始出现 更新1: 若我卸载应用程序并重新安装,那个么我也只能收
@Override
public void onTokenRefresh() {
//Getting registration token
refreshedToken = FirebaseInstanceId.getInstance().getToken();
//Displaying token on logcat
Log.d(TAG, "Refreshed token: " + refreshedToken);
saveDeviceToken(refreshedToken);
}
这只会在第一次启动时收到调用,在那之后,我还没有看到它被调用(我认为这是预期的行为)
OnMessage received也会在第一次通知时被调用,然后再也不会被取消:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d("FCM", "From: " + remoteMessage.getFrom());
if (remoteMessage.getNotification() != null) {
Log.d("FCM", "Notification Message Body: " + remoteMessage.getNotification().getBody());
sendNotification(remoteMessage.getNotification().getBody());
}
}
更新2:
尝试使用相同的服务器密钥和令牌访问FCM的HTTP api,并得到以下响应:
{
"multicast_id": 6286279702096230688,
"success": 0,
"failure": 1,
"canonical_ids": 0,
"results": [
{
"error": "NotRegistered"
}
]
}
为了避免交叉问题,这里还有一些细节:
- Android studio:v2.3.1
- 谷歌播放服务版本:10.0.1
- 库包括:核心、数据库、存储、消息传递——所有这些都有与google play service 10.0.1相同的版本
请帮我把它修好。注册令牌可能会在以下情况下更改:
- 应用程序删除实例ID
- 应用程序已在新设备上还原
- 用户卸载/重新安装应用程序
- 用户清除应用程序数据
private void RegisterFireBase()
{
if (BuildConfig.DEBUG) {
Task.Run(() =>
{
var instanceId = FirebaseInstanceId.Instance;
instanceId.DeleteInstanceId();
Android.Util.Log.Debug("TAG", "{0} {1}", instanceId?.Token?.ToString(), instanceId.GetToken(GetString(Resource.String.gcm_defaultSenderId), Firebase.Messaging.FirebaseMessaging.InstanceIdScope));
});
ServicePointManager.ServerCertificateValidationCallback += (o, certificate, chain, errors) => true;
}
FCM与GCM相反 在使用GCM类时,令牌ID会不时刷新,这就是为什么它也会在服务器上的数据库中更新 在使用FCM时。FCM基本体系结构使用唯一的令牌ID,这就是onTokenRefresh不会多次调用的原因。它只调用一次 您所要做的只是保存最初生成的令牌ID,并相应地使用它
p.S:In-FCM令牌在重新安装应用程序之前不会刷新。我记得以前也遇到过类似的问题。这就是我所做的,它对我来说工作顺利。希望这有帮助 PreferenceStore是一个帮助器类,用于保存、编辑和删除共享首选项
@Override
public void onTokenRefresh() {
String token = FirebaseInstanceId.getInstance().getToken();
Log.i(TAG, "New FCM Token: " + token);
setup_flag = PreferenceStore.getBoolean(getApplicationContext(), PrefKeys.IS_FIRST_FCM_TOKEN);
if (!setup_flag) {
// save token and boolean value in shared preferences for
// the first time you run the app after install
PreferenceStore.saveString(getApplicationContext(), "FCM_TOKEN", token);
PreferenceStore.saveBoolean(getApplicationContext(), "IS_FIRST_FCM_TOKEN", true);
} else {
// other time your app loads, update the token (like call the API endpoint).
}
}
这是我如何解决的
正如大家所指出的那样,.json文件的包名可能是导致此失败的主要原因,这一点在这里也得到了验证,但有一点扭曲
我从Firebase下载了.json文件,并假设下载了正确的.json文件。不幸的是,由于Firebase在下载文件时出现了一些错误,我总是得到我其他项目(Firebase应用程序)的.json文件。
在下载文件时,我找到了它,并在.json文件上手动更改了包名和密钥
我建议大家在尝试其他任何操作之前检查包含的.json文件,因为这是此类问题的主要原因。测试时,您是否尝试过先卸载并重新安装应用程序?是!我试过这个。我还尝试过重建缓存、完全更改包和json文件。我建议您将google play services&firebase更新到最新的10.2.4版本。Firebase仍处于后期测试阶段,其许多功能在更新中中断并得到修复,例如,从Firebase 10.0.x到10.2.x,用户名/照片的更改有问题,未经重新登录就无法实时显示。联系Firebase多次后,现在已经修复。当应用程序在后台运行时,也会调用onMessageReceived()。如果您的应用已停止,则默认系统通知将处理该通知。您是否有幸回答此问题?是的,请在评论中查看我的答案。我提供了完整的详细信息,只是为了通知您,我正在将令牌id保存在数据库中,当我在同一个数据库上发送通知时,它适用于第一次通知,然后在所有后续通知之后,它会向我显示上述错误。