当用户注销我的应用程序并且我不再希望他接收到设备的通知时,我该如何处理情况。

我试过了

FirebaseInstanceId.getInstance().deleteToken(FirebaseInstanceId.getInstance().getId(), FirebaseMessaging.INSTANCE_ID_SCOPE)

但是我仍然收到我设备的registration_id的通知。

我还确保这是我应该删除的 token :
FirebaseInstanceId.getInstance().getToken(FirebaseInstanceId.getInstance().getId(), FirebaseMessaging.INSTANCE_ID_SCOPE)

或简单地FirebaseInstanceId.getInstance().getToken())。

我也尝试了FirebaseInstanceId.getInstance().deleteInstanceId(),但是下次我调用FirebaseInstanceId.getInstance.getToken时,我会收到null(它可以在第二次尝试中使用)。

我猜想,在deleteInstanceId之后,我可以立即再次调用getToken(),但这看起来像是黑客。还有this answer声明不应执行此操作,但它建议删除显然无效的 token 。

那么正确的方法是什么呢?

最佳答案

好的。因此,我设法进行了一些测试,并得出以下结论:

  • deleteToken()getToken(String, String)的副本,但不是getToken()的副本。

  • 仅当您传递的发件人ID是不同的发件人ID(与您在google-services.json中可以看到的ID不一样)时,它才有效。例如,您要允许其他服务器发送到您的应用程序,请调用getToken("THEIR_SENDER_ID", "FCM")以授予他们授权以发送到您的应用程序。这将返回一个仅与特定发送者相对应的不同注册 token 。

    将来,如果您选择删除他们的授权以发送到您的应用程序,则必须使用deleteToken("THEIR_SENDER_ID", "FCM")。这将使相应的 token 无效,并且当发件人尝试发送消息时(作为预期的行为),他们将收到NotRegistered错误。
  • 为了删除您自己的发件人的 token ,正确的处理方法是使用deleteInstanceId()

  • 特别提及此answer by @Prince,特别是帮助我解决此问题的代码示例。

    正如@MichałK在他的帖子中已经做过的那样,在调用deleteInstanceId()之后,应调用getToken()以便发送新 token 的请求。但是,您不必第二次调用它。只要实现onTokenRefresh() onNewToken(),它就会自动触发为您提供新 token 。

    简而言之,deleteInstanceId()> getToken()>检查onTokenRefresh() onNewToken()

    注意:调用deleteInstanceId()不仅会删除您自己的应用程序的 token 。它将删除所有主题订阅以及与该应用程序实例关联的所有其他 token 。

    您确定要正确调用deleteToken()吗?受众群体的值(也可以从您链接的我的回答中看到)“设置为应用服务器的发送者ID”。您传递的getId()值与发件人ID不同(它包含应用程序实例ID值)。另外,您如何发送消息(App Server或Notifications Console)?
    getToken()getToken(String, String)返回不同​​的 token 。见我的答案here



    可能是因为第一次调用getToken()时,仍在生成它。这只是预期的行为。



    并不是的。这是获取新生成的(如果已经生成的) token 的方式。所以我认为很好。

    07-28 01:36