以下是我现在面临的问题。我有一个Web应用程序,其中包含连接到我的服务器的所有registration id
设备。在我的Android应用程序上。每次用户登录时,我都会将registration id
的请求发送到Google,转发到我的服务器,然后服务器将其保存并将其链接到用户。当用户从我的应用程序注销时。我的应用向服务器发送请求以销毁authentication code
和registration id
。问题是,当用户卸载应用程序并再次重新安装时,他的旧registration id
将保留在我的服务器上。所以当他用同一部手机登录时。应用程序将新的registration id
注册到我的服务器,当服务器发送通知时,该用户将收到多个通知,具体取决于他卸载应用程序的次数。你在这个方面的工作是什么?
答案 0 :(得分:1)
您必须在服务器上查看此内容。您无法从应用程序代码执行此操作,因为无法知道用户何时卸载应用程序。
当您发送推送通知时,GCM将检查用户是否有您的应用程序,如果用户已卸载该应用程序,GCM会记录相同的内容并通知您作为推送回复的一部分。
编辑 - From GCM docs
卸载的客户端应用取消注册的工作方式
客户端应用程序可以自动取消注册 卸载。但是,此过程不会立即发生。什么 在这种情况下发生的是:
- 最终用户卸载客户端应用程序。
- 应用服务器向GCM连接服务器发送消息。
- GCM连接服务器将消息发送到设备上的GCM客户端。
- 设备上的GCM客户端收到消息并检测到客户端应用程序已卸载;检测细节取决于 客户端应用程序运行的平台。
- 设备上的GCM客户端通知GCM连接服务器已卸载客户端应用程序。
- GCM连接服务器将注册令牌标记为删除。
- 应用服务器向GCM发送消息。
- GCM向应用服务器返回NotRegistered错误消息。
- 应用服务器应删除注册令牌。
醇>请注意,注册令牌可能需要一段时间 完全从GCM中删除。因此,有可能发送消息 在上面的步骤7中,获取有效的消息ID作为响应,即使 邮件将不会传递到客户端应用程序。最终, 注册令牌将被删除,服务器将获得 NotRegistered错误,无需任何进一步操作 应用服务器。
答案 1 :(得分:1)
客户端应用程序可以自动取消注册 卸载。但是,此过程不会立即发生。什么 在这种情况下发生的是:
- 最终用户卸载客户端应用程序。
- 应用服务器向GCM连接服务器发送消息。
- GCM连接服务器将消息发送到设备上的GCM客户端。
- 设备上的GCM客户端收到 消息并检测到客户端应用程序已卸载;该 检测详细信息取决于运行客户端应用程序的平台。
- 设备上的GCM客户端通知GCM连接服务器已卸载客户端应用程序。
- GCM连接服务器将注册令牌标记为删除。
- 应用服务器向GCM发送消息。 GCM向应用服务器返回NotRegistered错误消息。
- 应用服务器应删除注册令牌。
注意注册令牌可能需要一段时间才能完全显示 从GCM中删除。因此,可能在步骤7期间发送消息 以上获取有效的消息ID作为响应,即使消息 将不会发送到客户端应用程序。最终,注册 令牌将被删除,服务器将收到NotRegistered错误, 无需从应用服务器进行任何进一步操作。
请检查我们的:Downstream messages response codes
未注册的设备
200 +错误:未注册
现有的注册令牌可能在许多情况下停止有效,包括:
对于所有这些情况,请从应用服务器中删除此注册令牌,然后停止使用它来发送消息。
答案 2 :(得分:0)
这可以在您的服务器端代码上完成。
将请求的数据插入GCM表时,请检查您的用户ID是否已在表中?如果是,只需用新数据替换整行。否则将新数据插入表格。
旁注:最好还是检查重复的GCM注册ID。因为谷歌经常刷新所有GCM ID。
希望这会有所帮助。
正如@Haunter建议的那样,
如果用户拥有多个设备会怎么样?
在这种情况下,请在数据库中使用商店IMEI号并检查该号码而不是用户ID。
如何获取IMEI号
TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String IMEI = tel.getDeviceId().toString();
答案 3 :(得分:0)
我的代码有些变化:(可能会帮助某人)
我已删除IMEI以避免问题。为了使服务器验证所有用户registration
id有效,即使他/她重新安装应用程序。当android设备在服务器上注册新的注册ID时。保存新的注册ID后,服务器将运行一个worker,开始收集当前用户的所有注册ID,然后在每个注册id上发送一个虚拟通知(空字符串),当gcm响应规范ID> 0或像NotRegistered这样的错误,然后删除注册ID,