场景:我有第三方应用服务器,gcm http连接服务器和用于推送通知的Android应用设置。当用户卸载应用程序时,我可以通过向他们的(不再有效的)注册ID发送推送通知并处理从gcm连接服务器返回的"NotRegistered"
错误,将其从第三方服务器中删除。
但是,当您向订阅“主题”的用户发送推送通知时,这种类似的方法似乎不起作用,因为此处gcm连接服务器仅返回带有"message_id"
的json对象。
我的第三方服务器数据库表中的重要列如下:
| gcmRegistrationID (string) | subscribedToNotificationTopic (boolean) |
有谁知道如何识别之前在true
列中设置subscribedToNotificationTopic
的用户,然后卸载该应用?
我知道如何解决这个问题,但似乎有些混乱。
每隔一段时间,而不是只向主题发送推送通知,例如
{
"to" : "/topics/global",
...
}
向订阅该主题的用户的注册ID发送推送通知,例如
{
"registration_ids" : {list of registration ids},
...
}
这样我就可以检索并处理任何"NotRegistered"
错误。
然而,问题是,多播消息传递的用户数限制为1000,所以我必须每千人发送一条消息。
这似乎是不好的做法(特别是如果涉及多个主题),但也许这是唯一的方法?
(额外标签:主题消息,pubsub,取消注册,谷歌云消息传递)
答案 0 :(得分:0)
首先,我不确定假设" NotRegistered"错误只能是用户卸载应用程序的结果。如果设备收到消息但该消息无法传递,则设备似乎可以取消注册。如果用户停止应用程序(这与卸载应用程序不同,或者即使应用程序被终止并且由于省电模式而保持停止状态,也会发生这种情况。
https://developers.google.com/cloud-messaging/ccs#response
如果是NotRegistered,您应该从中删除注册ID 您的服务器数据库,因为该应用程序已从中卸载 设备或客户端应用程序未配置为接收消息。
您可以做的是从设备端,定期注册设备,并确保您获得的令牌与您存储的令牌相同,如果没有使用新令牌更新您的服务器。
至于通过对主题消息的回复来检测用户是否已经卸载了您的应用,我同意您的看法似乎不是直接可能的。作为您提议的解决方案的替代方案,您可能会不时地在主题消息中包含一个标志,该标志将要求设备使用您的服务器验证自身,如果设备在经过一些尝试或某段时间后未验证自身你可能会得出结论用户不再听的时间。
另一个问题是为什么你真的需要才能知道。向谷歌发送一些额外的注册表有什么害处吗?如果用户退出您的网络服务,您可以将其从列表中删除,但如果他们只是从设备上卸下您的应用,您是否真的需要采取措施? - 只需要考虑一些事情。希望这会有所帮助。