重新安装Android应用程序后,该应用程序会收到旧安装的通知

重新安装Android应用程序后,该应用程序会收到旧安装的通知,android,push-notification,google-cloud-messaging,Android,Push Notification,Google Cloud Messaging,我知道之前已经讨论过这一点,但我发现的唯一解决方案(规范ID)在我的场景中不起作用 情景: 用户安装应用程序并使用其用户帐户A注册 用户获取要传递到此特定用户帐户的推送通知 用户卸载应用程序 用户重新安装应用程序 用户使用不同的用户帐户B注册 现在,两个用户帐户都会收到通知。据我所知,使用cannonical GCM Reg ID只能合并这些ID并防止发送重复通知。在这种情况下,应用程序会收到不应该发送的其他用户的通知 有没有解决办法?我唯一能想到的是在卸载应用程序时主动取消注册,但在我读到

我知道之前已经讨论过这一点,但我发现的唯一解决方案(规范ID)在我的场景中不起作用

情景:

  • 用户安装应用程序并使用其用户帐户A注册
  • 用户获取要传递到此特定用户帐户的推送通知
  • 用户卸载应用程序
  • 用户重新安装应用程序
  • 用户使用不同的用户帐户B注册
现在,两个用户帐户都会收到通知。据我所知,使用cannonical GCM Reg ID只能合并这些ID并防止发送重复通知。在这种情况下,应用程序会收到不应该发送的其他用户的通知


有没有解决办法?我唯一能想到的是在卸载应用程序时主动取消注册,但在我读到的另一个线程中,不可能在卸载时执行代码。

在您的令牌数据库中注册时,当您收到用户B的令牌时,只需检查它是否已与任何用户关联,如果是,只需清空该字段并将新令牌保存给新用户即可。 As令牌标识设备而不是用户

如果您希望完全自主并控制与应用程序相关的通知,则应使用数据通知而不是消息通知,这将避免操作系统处理通知而不是应用程序

据我所知,使用cannonical GCM Reg ID只能合并这些ID并防止发送重复通知

这是一种看待它的方式,但更简单地说,规范ID就像说“您使用的旧ID已过期,请删除它(如果您保存了它),然后改用我”

让这有点奇怪的是,当用户卸载应用程序时,InstanceID应该无效。(见文件)

我认为您可以做什么来确保令牌被删除,您可以调用
deleteInstanceId()
来撤销所有令牌,然后重新注册

但是,为了确保消息是针对预期用户的,您可以参考中所述内容(第一条类似于@Ak9637所述内容):

要确保消息发送到预期用户,请执行以下操作:

  • 应用服务器可以维护当前用户和注册令牌之间的映射

  • 然后,客户端应用程序可以进行检查,以确保它接收到的消息与登录的用户匹配


如果应用程序不是多用户应用程序,则可以使用。因此,不同的用户可能拥有相同的令牌。我需要明确知道哪个令牌属于哪个注册。在这种情况下,您可以简单地使通知仅由您的应用程序而不是操作系统处理,这可以通过获得数据通知而不是普通通知来实现,一旦您收到此数据通知,客户端可以实现您想要的任何检查逻辑并添加到其中,我假设一个用户将在一个设备上签名,并且一次在一个设备上只有一个用户登录。请详细说明您的要求,您需要有多个用户关联到同一个设备时,登录用户在任何给定的时间将只是1我认为检查客户端似乎是唯一可行的选择。多个用户可以注册到多个提供者,以接收特定于用户-提供者关系的信息。每个注册可以接收推送通知,并且在同一设备上可以有多个注册,在多个设备上也可以有相同的注册。我假设发送数据通知会对用户隐藏此行为,但仍然可以在注册不再存在的设备上从通知中检索信息,对吗?不,新应用程序与旧应用程序具有相同的包名,因此如果使用消息通知而不是数据通知,android操作系统将存储通知并将其显示在匹配的包名HM上。因此,在重新安装后的第一个appstart上调用deleteInstanceId()应该会使旧安装的令牌无效,然后我可以重新注册并只使用新令牌?我说得对吗?@Chry007是的。但这是假定InstanceId没有失效。通常,应用程序卸载会自动使InstanceId无效,从而使关联的令牌过期。你案子上的古怪行为。也许有什么不对劲。做一些进一步的测试,让我知道它是否有效。@Chry007只是想报到,你能试一下吗?没有。不幸的是,我们把这件事的优先级降低了。但是它在列表上,我们一回到它,我就在这里更新。看。。。