由于我们系统上的错误,我们错误地通过附加到每个用户的个人资料中来存储每个设备的多个注册 ID,而不是在升级等之后进行替换。
我们现在显然可以通过处理我们收到的响应中的规范 ID 来纠正这一问题,但对于某些用户(例如我自己),他们会收到多个通知,而不是每个设备只收到一个通知。
我已阅读可以通过哪些方式发送内容,
http://developer.android.com/google/gcm/http.html
和
http://developer.android.com/google/gcm/server.html#params
但似乎还没有一个完美的解决方案。我刚刚在那里检查过,我可以首先发送一个“dry_run”请求,处理多个注册ID,替换需要替换的内容,删除需要删除的内容,然后发送第二个(修剪过的)请求。
这当然可能是一个解决方案,但我无法想象它会对我们的 api 配额友好(尽管我真的不知道)。是否没有其他属性可以在 HTTP 请求上设置以便仅发送到单个设备?
最佳答案
GCM is completely free no matter how big your messaging needs are, and there are no quotas.
(引自 here )。
GCM 没有配额,因此您可以毫无恐惧地尝试 dry_run 方法。唯一的问题是 dry_run 模式是否实际上返回规范注册 ID,或者只是立即返回一些虚假消息 ID。
使用规范注册 ID 响应是清理数据库的唯一方法(除了删除数据库并从头开始重建它之外)。
您可以在清理过程中进行一些小的优化。如果您可以按照插入顺序(从最旧到最新)从数据库中获取注册 ID,您可能会收到您尝试的第一个注册 ID 的规范注册 ID 响应。对于它们中的每一个,您都会知道当前(规范)注册 ID 是什么,并且您将对其进行标记,这样您就不会在清理过程中发送给它。这将防止为数据库中最多有 2 个注册 ID 的所有设备发送重复消息(并且会将其他设备的重复消息数量减少 1)。
关于Android GCM 仅向具有多个注册 ID 的设备发送一条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21173425/