在我的应用程序中,注册设备后,它将存储为持久性数据,以检查设备是否已注册。

在服务器端,我将它们与user_id一起存储在数据库中,后者是用户的唯一ID。



现在我无法解决这种情况:

如果用户注销:

  • 必须清除存储在SharedPreferences中的registration_id,因为其他用户可能会在下次启动该应用程序时登录。
  • 另外,我必须从数据库中删除与那个registration_id相对应的行,因为该设备(当前没有登录用户)必须不再接收任何通知。

  • 问题是我的数据库使用canonical_ids更新或说我在调用时获得的最新registration_ids

    https://android.googleapis.com/gcm/send

    因此,有机会我无法找到注销用户的旧registration_id来删除,这仍然允许向未登录用户发送通知。

    另外,我无法删除与user_id匹配的数据库行,因为用户可能仅从1台设备注销,并且他/她仍在登录的设备很少。

    我怎么知道对于此特定用户和设备,注册ID已更改?

    我是否应该在数据库中存储所有旧的注册ID及其对应的canonical_id?

    最佳答案

    您有两种选择:

  • 如注释中所建议-将注销用户的注册ID保留在您的数据库中,但用一个标志表示它是注销用户来进行标记。您的服务器不会将通知发送给标记为已注销的注册ID。
  • 当用户从设备上的应用程序注销时,该设备上的应用程序将从GCM取消注册,并使用用户ID和注册ID向您的服务器发送注销请求。服务器将从数据库中删除该用户ID/注册ID组合。即使您的服务器出于某种原因为该设备包含了较新的注册ID(导致删除尝试失败),您也将无法通过该注册ID向该设备发送通知,因为该应用已从GCM中取消了该设备的注册服务。但是无论如何这种情况都不太可能发生,因为每当GCM更改给定设备上给定应用程序的注册ID时,都会将该注册ID发送给该应用程序,并且该应用程序应发送至您的服务器。否则,可能会导致服务器发送带有旧注册ID的通知并在响应中获得新的规范注册ID的情况。
  • 关于Android-GCM : How to take care of a logged out user?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16851677/

    10-12 07:05