GCM:用户卸载应用程序时处理旧的RegistrationId

时间:2016-09-20 08:08:48

标签: android server

以下是我现在面临的问题。我有一个Web应用程序,其中包含连接到我的服务器的所有registration id设备。在我的Android应用程序上。每次用户登录时,我都会将registration id的请求发送到Google,转发到我的服务器,然后服务器将其保存并将其链接到用户。当用户从我的应用程序注销时。我的应用向服务器发送请求以销毁authentication coderegistration id。问题是,当用户卸载应用程序并再次重新安装时,他的旧registration id将保留在我的服务器上。所以当他用同一部手机登录时。应用程序将新的registration id注册到我的服务器,当服务器发送通知时,该用户将收到多个通知,具体取决于他卸载应用程序的次数。你在这个方面的工作是什么?

4 个答案:

答案 0 :(得分:1)

参考Official document

您必须在服务器上查看此内容。您无法从应用程序代码执行此操作,因为无法知道用户何时卸载应用程序。

当您发送推送通知时,GCM将检查用户是否有您的应用程序,如果用户已卸载该应用程序,GCM会记录相同的内容并通知您作为推送回复的一部分。

编辑 - From GCM docs

  

卸载的客户端应用取消注册的工作方式

     

客户端应用程序可以自动取消注册   卸载。但是,此过程不会立即发生。什么   在这种情况下发生的是:

     
      
  1. 最终用户卸载客户端应用程序。
  2.   
  3. 应用服务器向GCM连接服务器发送消息。
  4.   
  5. GCM连接服务器将消息发送到设备上的GCM客户端。
  6.   
  7. 设备上的GCM客户端收到消息并检测到客户端应用程序已卸载;检测细节取决于   客户端应用程序运行的平台。
  8.   
  9. 设备上的GCM客户端通知GCM连接服务器已卸载客户端应用程序。
  10.   
  11. GCM连接服务器将注册令牌标记为删除。
  12.   
  13. 应用服务器向GCM发送消息。
  14.   
  15. GCM向应用服务器返回NotRegistered错误消息。
  16.   
  17. 应用服务器应删除注册令牌。
  18.         

    请注意,注册令牌可能需要一段时间   完全从GCM中删除。因此,有可能发送消息   在上面的步骤7中,获取有效的消息ID作为响应,即使   邮件将不会传递到客户端应用程序。最终,   注册令牌将被删除,服务器将获得   NotRegistered错误,无需任何进一步操作   应用服务器。

答案 1 :(得分:1)

来自Official Documentation

  

客户端应用程序可以自动取消注册   卸载。但是,此过程不会立即发生。什么   在这种情况下发生的是:

     
      
  • 最终用户卸载客户端应用程序。
  •   
  • 应用服务器向GCM连接服务器发送消息。
  •   
  • GCM连接服务器将消息发送到设备上的GCM客户端。
  •   
  • 设备上的GCM客户端收到   消息并检测到客户端应用程序已卸载;该   检测详细信息取决于运行客户端应用程序的平台。
  •   
  • 设备上的GCM客户端通知GCM连接服务器已卸载客户端应用程序。
  •   
  • GCM连接服务器将注册令牌标记为删除。
  •   
  • 应用服务器向GCM发送消息。 GCM向应用服务器返回NotRegistered错误消息。
  •   
  • 应用服务器应删除注册令牌。
  •   
     

注意注册令牌可能需要一段时间才能完全显示   从GCM中删除。因此,可能在步骤7期间发送消息   以上获取有效的消息ID作为响应,即使消息   将不会发送到客户端应用程序。最终,注册   令牌将被删除,服务器将收到NotRegistered错误,   无需从应用服务器进行任何进一步操作。

请检查我们的:Downstream messages response codes

未注册的设备

200 +错误:未注册

现有的注册令牌可能在许多情况下停止有效,包括:

  • 如果客户端应用程序取消注册FCM。
  • 如果客户端应用程序自动取消注册,则可能会发生这种情况 用户卸载应用程序。例如,在iOS上,如果是APNS 反馈服务将APNS令牌报告为无效。
  • 如果注册令牌过期(例如,Google可能会决定 刷新注册令牌,或iOS的APNS令牌已过期 设备)。
  • 如果客户端应用程序已更新但新版本未配置为 收到消息。

对于所有这些情况,请从应用服务器中删除此注册令牌,然后停止使用它来发送消息。

答案 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,