Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 发送一个通知后出现未注册令牌错误_Android_Firebase_Notifications_Google Cloud Messaging_Firebase Cloud Messaging - Fatal编程技术网

Android 发送一个通知后出现未注册令牌错误

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: 若我卸载应用程序并重新安装,那个么我也只能收

在使用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相同的版本
更新3:Firebase崩溃,数据库和存储在同一个项目中工作(这表明google service.json文件是正确的)


请帮我把它修好。

注册令牌可能会在以下情况下更改:

  • 应用程序删除实例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类时,令牌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保存在数据库中,当我在同一个数据库上发送通知时,它适用于第一次通知,然后在所有后续通知之后,它会向我显示上述错误。