将GCM通知发送到脱机设备

时间:2013-06-04 06:50:25

标签: android google-cloud-messaging

如果我向设备发送通知,并且该设备处于离线状态,我会收到以下内容:

  

错误:不可用

我必须重新发送。

我的问题是:

GCM服务器是否会将这些通知保留在队列中并在设备联机时自动重新发送?或者它必须由我完全处理。

因为如果GCM服务器要自动发送它们(一旦设备在线),直到它实际发送通知,我的服务器假定它们已经发送。如何跟踪成功重新发送通知的时间?

我可能会在服务器端标记通过查看Unavailable error message未发送通知,但无法知道如何在GCM成功发送通知后将其标记为已发送。

谢谢

2 个答案:

答案 0 :(得分:11)

A / c to documentation ---当第三方服务器向GCM发布消息并收回消息ID时,并不意味着该消息已经传递给设备。相反,它意味着它被接受交付。邮件被接受后会发生什么情况取决于很多因素。

如果设备已连接但空闲,除非delay_while_idle标志设置为true,否则仍会立即传递消息。否则,它将存储在GCM服务器中,直到设备处于唤醒状态。而且这就是collapse_key标志起作用的地方:如果已经存在一条消息,其中存储了相同的折叠密钥(和注册ID)并等待传递,则旧消息将被丢弃,新消息将取代它(即,旧消息将被新消息折叠。但是,如果未设置折叠键,则会存储新旧邮件以供将来传递。

注意:如果没有折叠,可以存储的邮件数量有限制。该限制目前为100.如果达到限制,则丢弃所有存储的消息。

答案 1 :(得分:2)

我所做的是将推送指示有效负载分开。在我的GCM消息中,我只包含有效负载的URI,并将有效负载存储在可通过消息中的URI访问的数据库表中。

当客户收到消息时,它可以例如看起来像这样,使用HATEOAS样式链接:

{
  _links: {
    message: {
      rel: 'message',
      href: 'https://my-server.com/push/<messageId>'
    }
  }
}

然后,客户端从URI转到GET消息有效负载,此时服务器知道它已经被传递并且可以相应地更新。获取有效负载也会删除它。

如果GCM重新传递不够健壮,这也意味着客户端可以选择手动获取所有待处理的消息,例如当离线后恢复网络连接时,通过使端点返回给定ANDROID_ID或类似的所有消息。如果稍后GCM消息传递,则客户端将获得该消息中的URI的404,并将其视为无操作,即已处理的消息。

如果这样做有点过分,那么只需实现服务器对消息传递的认识的轻量级方法就是让端点只是确认接收到具有给定ID的消息,例如

POST https://my-server.com/push/notifyReceived

{
  messageId: <messageId>
}