发送一条通知后,未注册的令牌错误



我在使用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文件,因为这是此类问题的主要原因。

相关内容

  • 没有找到相关文章

最新更新