5

在我的应用程序中,一旦我注册了一个设备,它就会作为持久数据存储,以检查设备是否已经注册。

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

[user_id] [gcm_registration_id]

现在我无法处理这种情况:

如果用户注销:

  1. 必须清除存储在 SharedPreferences 中的registration_id,因为下次启动应用程序时可能会有其他用户登录。

  2. 此外,我必须从我的数据库中删除与该 registration_id 对应的行,因为该设备(当前没有登录用户)不能再收到任何通知。

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

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

因此,我有可能找不到要删除的已注销用户的旧registration_id,这仍然允许向未登录用户发送通知。

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

我如何知道对于这个特定的用户和设备,注册 ID 已更改?

我应该将所有旧的注册 ID 及其对应的 canonical_ids 存储在我的数据库中吗?

4

2 回答 2

5

你有两个选择:

  1. 正如评论中所建议的 - 保留在您的数据库中注销的用户的注册 ID,但用一个标志标记它,表明它是一个已注销的用户。您的服务器不会向标记为已注销的注册 ID 发送通知。

  2. 当用户在设备上从您的应用注销时,该设备上的应用将从 GCM 注销并向您的服务器发送注销请求,其中包含用户 ID 和注册 ID。服务器将从数据库中删除该用户 ID/注册 ID 组合。即使由于某种原因您的服务器包含该设备的新注册 ID(导致删除尝试失败),您也无法向具有该注册 ID 的设备发送通知,因为该应用程序已从 GCM 取消注册该设备服务。但是这种情况不太可能发生,因为每当 GCM 更改给定设备上给定应用程序的注册 ID 时,都会将该注册 ID 发送到应用程序,并且应用程序应该发送到您的服务器。

于 2013-05-31T14:18:52.037 回答
-1

private String android_id = Secure.getString(getContext().getContentResolver(),Secure.ANDROID_ID); 此行将为任何设备返回一个唯一的 android_id ( thx ) 对于任何用户,您可以存储设备数组,在记录时从客户端发送消息或每隔几分钟检查一次。希望

于 2013-05-31T07:25:02.283 回答