GCM、注册 ID 和处理用户 login/logout
GCM , Registration ID and handling user login/logout
我有一个允许用户使用服务器颁发的凭据登录的应用程序,假设使用密码和用户名进行简单登录。
所以用户启动应用程序,输入用户名和密码,服务器验证用户,保存这些信息。 (细节在这种情况下真的不起任何作用)。
我需要实施什么?
当我的服务器需要通知用户时有一些事件。让我们考虑订单状态已更改。如果是这样,我需要通过状态栏中的通知通知用户。
我决定使用 GCM 来完成这项任务。
我读到了这个,并提出了一些问题。
当用户在 android 中从 GCM 服务获取注册 ID 时,它是不变的还是可以更改的。据我所知,不能保证它总是一样的。那么我该如何处理这个 ID 的刷新。
或者,如果我不调用 GoogleCloudMessaging.getInstance(applicationContext).register
,它将保持不变,直到我注册新的,或者即使我调用注册方法,它也可以 return 相同的 ID。我可以将此 ID 保存在 SharedPreferences 中以长期使用吗?或者过段时间就失效了?
主要问题是我需要在同一台设备上处理多个用户。据我所知,由 gcm 服务发布的注册 ID 绑定到设备和应用程序。因此,如果新用户注销并使用新凭据(新用户帐户)登录,我该如何处理?例如,我可以将此 ID 存储在服务器上的数据库中,并使用它直到用户从我的应用程序中的帐户注销,然后将其从数据库中删除,如果此设备上的用户将使用另一个帐户注册 ID 登录,则可以用于通知其他用户?它会工作吗?或者我错过了什么。
如何处理用户多设备。我的组通知密钥将是来自用户帐户(电子邮件、用户名..)的一些唯一数据。如果我理解正确,我需要在用户使用我的服务器帐户登录的所有设备上获取注册 ID,并将其映射到一个通知密钥。我是否应该自己处理通知取消而不是将上游消息发送到 GCM 服务器以通知其他用户设备通知已被取消?
请帮助理解此服务。
提前致谢。
我已经在我们的一个应用程序中实现了这一点。在此我们会在添加新列表时向用户发送通知。
用户可以同时从多个设备登录。设备可能是 android 或 iOS 任何东西。
多个用户也可以从同一设备登录(在注销之前的用户后)。
每当用户从 Android 设备登录时,都会从 GCM 获取注册 ID。这个 GCM id 对于一个设备来说不是恒定的,每当你再次从 GCM 服务器请求它时它就会改变。
我们使用通知密钥向多个设备发送通知,它包含所有设备的 GCM 注册 ID。如果您丢失了通知密钥,则无法取回。更糟糕的是,您无法使用以前使用的通知密钥名称重新生成新的通知密钥。
切勿使用来自用户帐户(电子邮件、用户名..)的唯一数据作为通知密钥名称。始终生成一些随机字符串作为通知密钥名称。
要克服此问题,请执行以下步骤:
创建一个table来存储以下详细信息
列 :
ID
用户身份
设备GCMId
设备编号
通知键
notificationKeyName
每当用户登录时,都会向服务器发送以下参数。
GCMId, deviceId, userId
- 首先检查userId和deviceId是否存在。
如果不存在则转到第 5 步否则转到第 6 步
- 从给定的 userId 中获取来自 table 的 notificationKey 和 notificationKeyName。如果未找到,则生成新的 notificationKeyName 并从该密钥生成新的 notificationKey。使用当前的 GCMRegId 生成密钥。将密钥存储在变量中。
- 在 table 中添加新条目,其中包含在步骤 4 中生成的 notificationKey 和键名。还在通知键下添加 GCM id。
- 检查 deviceId 是否相同且 GCM id 不同,然后在 table 中添加更新 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
希望这会有所帮助
我有一个允许用户使用服务器颁发的凭据登录的应用程序,假设使用密码和用户名进行简单登录。
所以用户启动应用程序,输入用户名和密码,服务器验证用户,保存这些信息。 (细节在这种情况下真的不起任何作用)。
我需要实施什么?
当我的服务器需要通知用户时有一些事件。让我们考虑订单状态已更改。如果是这样,我需要通过状态栏中的通知通知用户。
我决定使用 GCM 来完成这项任务。
我读到了这个,并提出了一些问题。
当用户在 android 中从 GCM 服务获取注册 ID 时,它是不变的还是可以更改的。据我所知,不能保证它总是一样的。那么我该如何处理这个 ID 的刷新。 或者,如果我不调用
GoogleCloudMessaging.getInstance(applicationContext).register
,它将保持不变,直到我注册新的,或者即使我调用注册方法,它也可以 return 相同的 ID。我可以将此 ID 保存在 SharedPreferences 中以长期使用吗?或者过段时间就失效了?主要问题是我需要在同一台设备上处理多个用户。据我所知,由 gcm 服务发布的注册 ID 绑定到设备和应用程序。因此,如果新用户注销并使用新凭据(新用户帐户)登录,我该如何处理?例如,我可以将此 ID 存储在服务器上的数据库中,并使用它直到用户从我的应用程序中的帐户注销,然后将其从数据库中删除,如果此设备上的用户将使用另一个帐户注册 ID 登录,则可以用于通知其他用户?它会工作吗?或者我错过了什么。
如何处理用户多设备。我的组通知密钥将是来自用户帐户(电子邮件、用户名..)的一些唯一数据。如果我理解正确,我需要在用户使用我的服务器帐户登录的所有设备上获取注册 ID,并将其映射到一个通知密钥。我是否应该自己处理通知取消而不是将上游消息发送到 GCM 服务器以通知其他用户设备通知已被取消?
请帮助理解此服务。
提前致谢。
我已经在我们的一个应用程序中实现了这一点。在此我们会在添加新列表时向用户发送通知。
用户可以同时从多个设备登录。设备可能是 android 或 iOS 任何东西。 多个用户也可以从同一设备登录(在注销之前的用户后)。
每当用户从 Android 设备登录时,都会从 GCM 获取注册 ID。这个 GCM id 对于一个设备来说不是恒定的,每当你再次从 GCM 服务器请求它时它就会改变。
我们使用通知密钥向多个设备发送通知,它包含所有设备的 GCM 注册 ID。如果您丢失了通知密钥,则无法取回。更糟糕的是,您无法使用以前使用的通知密钥名称重新生成新的通知密钥。 切勿使用来自用户帐户(电子邮件、用户名..)的唯一数据作为通知密钥名称。始终生成一些随机字符串作为通知密钥名称。
要克服此问题,请执行以下步骤:
创建一个table来存储以下详细信息 列 : ID 用户身份 设备GCMId 设备编号 通知键 notificationKeyName
每当用户登录时,都会向服务器发送以下参数。 GCMId, deviceId, userId
- 首先检查userId和deviceId是否存在。 如果不存在则转到第 5 步否则转到第 6 步
- 从给定的 userId 中获取来自 table 的 notificationKey 和 notificationKeyName。如果未找到,则生成新的 notificationKeyName 并从该密钥生成新的 notificationKey。使用当前的 GCMRegId 生成密钥。将密钥存储在变量中。
- 在 table 中添加新条目,其中包含在步骤 4 中生成的 notificationKey 和键名。还在通知键下添加 GCM id。
- 检查 deviceId 是否相同且 GCM id 不同,然后在 table 中添加更新 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
希望这会有所帮助