我所做的是将推送指示与有效负载分开。在我的 GCM 消息中,我只包含有效负载的 URI,并且我将有效负载存储在一个数据库表中,该数据库表可通过消息中的 URI 访问。
当客户端收到一条消息时,它可能看起来像这样,带有 HATEOAS 样式的链接:
{
_links: {
message: {
rel: 'message',
href: 'https://my-server.com/push/<messageId>'
}
}
}
客户端然后从 URI 转到GET消息有效负载,此时服务器知道它已被传递并可以相应地更新。获取有效负载也会将其删除。
如果 GCM 重新传递不够健壮,这也意味着客户端可以选择手动获取所有未决消息,例如,当网络连接在离线后恢复时,通过具有返回给定 ANDROID_ID 或类似的所有消息的端点。如果稍后传递 GCM 消息,客户端将获得该消息中 URI 的 404 并将其视为无操作,即消息已处理。
如果这太过分了,一种仅实现服务器对消息传递的感知的轻量级方法是使用一个端点来简单地 ACK 接收具有给定 ID 的消息,例如
POST https://my-server.com/push/notifyReceived
{
messageId: <messageId>
}