我在使用Firebase时在Android应用程序中面临着这个戏剧性的问题。1.我的应用在第一次发布时收到令牌2.我能够从Firebase Console发送通知到注册的令牌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);
}
这仅首次启动了电话,此后,我还没有看到它被调用(我认为这是预期的行为(。
收到的通知也接收到了,然后再也没有被取消:
@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
- Google Play服务版本:10.0.1
- 库包括:核心,数据库,存储,消息传递 - 所有版本都与Google Play Service 10.0.1 具有相同的版本
更新3:Firebase崩溃,数据库和存储在同一项目中工作(这表明Google Service.json文件正确(。
请帮助我修复它。
我记得以前遇到过类似的问题。这是我所做的,它对我来说很顺利。希望这会有所帮助,
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).
}
}
当注册令牌可能会更改时:
- 该应用程序删除实例ID
- 该应用程序已在新设备上恢复
- 用户卸载/重新安装应用
- 用户清除应用数据。
您可以在此处查看文档
,您也可以在这里阅读有关FCM错误仅在调试模式中发生这种情况,因此您可以在启动器活动中调用此方法,这将接受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;
}
fcm与GCM相反。
在使用GCM类时,Tokenid时不时会刷新,这就是为什么在服务器上的数据库中更新它。
使用FCM时。FCM基本体系结构可用于独特的代币,这就是OntokenRefresh不会多次调用的原因。它仅调用一次。
您要做的就是保存您的最初生成的tokenid并相应地使用它。
p.s:在FCM代币中,直到并重新安装了该应用程序才能刷新。
在这里我如何修复。
正如每个包装名称.json文件名称的每个人所指出的,这可能是此失败的主要原因,但在这里也是如此。
我已经从firebase下载了.json文件,并假设正确的.json文件已下载。不幸的是,由于Firebase中的某些错误下载了该文件,我总是收到我的其他项目(Firebase App(的.json文件。在投资下载的文件时,我弄清楚了,并在.json文件上手动更改包装和键。
我建议大家在尝试其他任何内容之前先检查随附的.json文件,因为这是此类问题的主要原因。