当用户注销我的应用程序并且我不再希望他接收到设备的通知时,我该如何处理情况。
我试过了
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
错误。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 的方式。所以我认为很好。