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

时间:2017-04-21 00:16:35

标签: 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也会在第一次通知时被调用,然后它永远不会被取消:

@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文件正确)。

请帮我修好。

4 个答案:

答案 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)

注册令牌可能会在以下情况下发生变化:

  • 该应用删除实例ID
  • 该应用已在新设备上恢复
  • 用户卸载/重新安装应用
  • 用户清除应用数据。

您可以看到文档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文件,因为这是此类问题的主要原因。