我在使用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也会在第一次通知时被调用,然后它永远不会被取消:
@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"
}
]
}
为了避免交叉问题,这里有更多细节:
更新3:Firebase崩溃,数据库和存储工作在同一个项目中(显示google service.json文件正确)。
请帮我修好。
答案 0 :(得分:1)
我记得以前遇到过类似的问题。这就是我所做的,它对我的工作顺利。希望这会有所帮助,
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).
}
}
答案 1 :(得分:0)
注册令牌可能会在以下情况下发生变化:
您可以看到文档here
您还可以阅读有关fcm错误的here 这只适用于调试模式,因此您可以在启动器活动中调用此方法,这将接受测试/开发服务器的HTTPS证书,因为HTTPS证书无效/不受信任 在发布中它会没问题。
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;
}
答案 2 :(得分:0)
FCM与GCM相反。
使用GCM类时,TokenID会不时刷新,这就是为什么它也会在服务器上的数据库中更新。
使用FCM时。 FCM基本架构适用于唯一的TokenID,这就是onTokenRefresh不会多次调用的原因。它只调用一次。
您需要做的就是保存初始生成的TokenID并相应地使用它。
P.S:在FCM令牌中,除非重新安装该应用,否则不会刷新。
答案 3 :(得分:-1)
我在这里解决了。
正如大家所指出的那样.json文件的软件包名称可能是这种失败的主要原因,这种情况在这里也是如此,但有一个转折点。
我从Firebase下载了.json文件,并假设正在下载正确的.json文件。不幸的是,由于Firebase在下载文件时出现了一些错误,我总是得到一些其他项目(firebase应用程序)的.json文件。 在投资下载的文件时,我想出来并在.json文件上手动更改包名和密钥。
我建议大家在尝试其他任何内容之前检查包含的.json文件,因为这是此类问题的主要原因。