Android 当用户同时从多个设备登录并且在同一设备上登录了多个帐户时,使用GCM

Android 当用户同时从多个设备登录并且在同一设备上登录了多个帐户时,使用GCM,android,google-cloud-messaging,chat,Android,Google Cloud Messaging,Chat,我正在使用GCM进行在线聊天应用。但我认为仍有一些领域需要深入挖掘。我知道GCM为每个设备/应用程序提供一个注册id。如果一个用户注销,另一个用户从同一设备登录,该怎么办。如何确保消息已发送给相关用户。 为了解决这个问题,每次用户登录或注册时,我都要注册用户。当他/她注销时,我正在从数据库中删除注册id。我仍然对这种方法有些怀疑,任何信息都会非常有用。来自: 客户端应用程序应调用这些注销和取消订阅 仅当它需要停止接收消息时才起作用开发人员 永远不要将客户端应用程序注销为注销或删除的机制 用于在用

我正在使用GCM进行在线聊天应用。但我认为仍有一些领域需要深入挖掘。我知道GCM为每个设备/应用程序提供一个注册id。如果一个用户注销,另一个用户从同一设备登录,该怎么办。如何确保消息已发送给相关用户。 为了解决这个问题,每次用户登录或注册时,我都要注册用户。当他/她注销时,我正在从数据库中删除注册id。我仍然对这种方法有些怀疑,任何信息都会非常有用。

来自:

客户端应用程序应调用这些注销和取消订阅 仅当它需要停止接收消息时才起作用开发人员 永远不要将客户端应用程序注销为注销或删除的机制 用于在用户之间切换,原因如下:

  • 注册令牌与特定的登录令牌不关联 用户。如果客户端应用程序注销然后重新注册,则该应用程序可以 接收相同的注册令牌或不同的注册令牌
  • 注销和重新注册可能需要五分钟才能完成 传播。在此期间,消息可能会由于以下原因而被拒绝: 未注册状态,消息可能发送到错误的用户
使 确保消息发送到目标用户:

  • 应用服务器可以维护当前用户和应用程序之间的映射 注册令牌
  • 然后,客户端应用程序可以检查以确保 它接收到的消息与登录的用户匹配
这意味着:

  • 在应用程序启动时(重新)注册GCM,在注销时不注销
  • 登录时在数据库中存储设备令牌(将令牌映射到帐户)
    • 应该可以为同一帐户存储多个设备令牌
  • 注销时从数据库中删除设备令牌
  • 要向某个帐户发送通知,请将其发送到为该帐户存储的所有设备令牌
  • 此外,您可以检查通知是否发送给设备本身上的登录用户(在通知有效负载中发送帐户ID)

您还可以
取消注册
id
。还有一种方法可以从
GCM
中注销id。如果我只在用户(比如说user1)从设备(比如device1)注销时注销,而不从(user1)中列出的用户表中删除该id。将来,如果另一个用户(比如user2)从以前的设备(device1)登录,并且我想向从另一个设备(device2)登录的用户(user1)发送消息,则可能会产生问题。My users表将保存上一个设备(device1)的注册id,并且用户(user1)是从另一个设备(device2)登录的每个设备都有自己的
设备令牌
,所以您可以在注销时从数据库中删除注册id并从gcm注销。即使您不从数据库中删除注册id,只从gcm注销,用户也不会收到通知消息。但这就是我不建议您取消注册并将其从数据库中删除的原因