GCM,注册ID和处理用户登录/注销

4
我有一个应用程序,允许用户使用服务器发放的凭证登录,例如简单的用户名和密码。
因此,用户启动应用程序,输入用户名和密码,服务器对用户进行身份验证并保存此信息(详细信息在此情况下没有真正作用)。
我需要实现什么?
在我的服务器需要通知用户时,有一些事件。让我们考虑订单状态已更改。如果是这样,我需要通过状态栏中的通知通知用户。
我决定使用GCM完成这项任务。
我阅读了有关此事的信息,并提出了一些问题。
  1. 当用户从GCM服务中获取注册ID时,在Android设备上,它是固定的还是可以更改的。据我所知,不能保证它始终相同。那么我该如何处理此ID的刷新。 或者,如果我不调用GoogleCloudMessaging.getInstance(applicationContext).register,它将保持不变,直到我重新注册,甚至如果我调用register方法,它也可以返回相同的ID。我可以将此ID保存在SharedPreferences中以供长期使用吗?或者它会在一段时间后失效吗?
  2. 主要问题是我需要处理同一设备上的多个用户。据我所知,由GCM服务发放的注册ID与设备和应用程序绑定。因此,如果新用户注销并以新凭证(新用户帐户)登录,我该如何处理?例如,我可以将此ID存储在我的服务器的数据库中,并在用户从应用程序内注销帐户后使用它,然后从数据库中删除它,并且如果同一设备上的用户使用另一个帐户登录,则可以使用注册ID来通知另一个用户吗?这会有效吗?或者我漏掉了什么。
  3. 如何处理用户多个设备。我的群组通知密钥将是来自用户帐户(电子邮件,用户名等)的某些唯一数据。如果我理解正确,我需要在用户使用其我的服务器帐户登录的所有设备上获取注册ID,并将其映射到一个通知密钥。我应该自己处理通知的拒绝,然后向GCM服务器发送上行消息,以通知其他用户设备已被拒绝吗?
请帮助理解此服务。 提前致谢。
1个回答

6
我已经在我们的一个应用程序中实现了此功能。在这种情况下,每当添加新列表时,我们向用户发送通知。
用户可以同时从多个设备登录。设备可能是Android或iOS任何设备。同样,多个用户可以从同一设备登录(在注销之前的用户之后)。
每当用户从Android设备登录时,将从GCM获取注册ID。这个GCM ID对于一个设备来说不是固定的,每当你再次从GCM服务器请求它时,它都会改变。
我们使用通知键向多个设备发送通知,它包含所有设备的GCM注册ID。如果您丢失了通知键,则无法重新获取它。更糟糕的是,您无法使用先前使用过的通知键名称生成新的通知键。永远不要使用用户帐户(电子邮件,用户名等)中的唯一数据作为通知键名称。始终生成一些随机字符串作为通知键名称。
为了克服这个问题,请按照以下步骤操作:
  1. 创建一个表来存储以下详细信息 列: id userId deviceGCMId deviceId notificationKey notificationKeyName

  2. 每当用户登录时,将以下参数发送到服务器。 GCMId、deviceId、userId

  3. 首先检查userId和deviceId是否存在。 如果不存在,则转到步骤5,否则转到步骤6
  4. 从给定的userId获取表中的notificationKey和notificationKeyName。如果没有找到,则生成新的notificationKeyName并从该键生成新的notificationKey。使用当前的GCMRegId生成密钥。将密钥存储在变量中。
  5. 在表中添加新条目,其中包括在步骤4中生成的notificationKey和keyname。还要在通知键下添加GCM id。
  6. 检查deviceId是否相同且GCM id是否不同,然后更新表中的GCM id并将该GCM id添加到通知键下。如果设备ID和GCM ID相同,则无需执行任何操作
有时通知键会从GCM服务器中丢弃,并显示找不到键的错误。在这种情况下,从新的键名称创建新的notificationKey并添加针对该键的GCM id。
欲了解更多信息,请参阅以下有用链接: https://medium.com/appunite-edu-collection/notifications-d7df385b0ff4 https://medium.com/@Bicx/adventures-in-android-user-notifications-e6568871d9be 希望这可以帮助到您。

用户能否在注销前获得之前的消息?当已登录的用户接收到消息时,希望我表达清楚。谢谢。 - mubeen
如果用户从应用程序注销,则无法收到消息。因为每当调用注销操作时,我们都会从通知键中删除设备GCM ID。 - Santosh Jagtap
是的,但如果我们将注销用户的数据存储在其他存储中,当用户登录时,它会检查用户可用的数据并将其发送给用户。这是我的想法。 - mubeen
@SantoshJagtap 在第6点,如果设备的GCM ID不同,我只需要在通知键下添加新的GCM ID,还是也必须删除旧的GCM ID(使用删除帖子)? - MattC
MattC,你需要在通知密钥中添加这个新的GCM密钥。 - Santosh Jagtap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接