2013-06-04 122 views
9

如果我发送通知到设备,而设备是离线我得到的是这样的:发送GCM通知到离线设备

Error: Unavailable

而且我必须重新发送。

我的问题是:

请问GCM服务器保持这些通知在队列中,并自动对时设备在线重新发送?或者它必须完全由我处理。

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

我可能会在我的服务器端标记,通过查看Unavailable error message不发送通知,但无法确定如何将它们标记为GCM成功发送通知后发送的通知。

谢谢

回答

11

A/C到文档---当第三方服务器发布消息到GCM和接收消息ID后面,但这并不意味着该消息已传送到设备。相反,这意味着它被接受交付。消息被接受后会发生什么取决于许多因素。

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

注意:可以存储多少条消息而不折叠的限制。该限制目前为100.如果达到限制,则丢弃所有存储的消息。

+0

怎么会我的服务器知道通知何时最终发送(成功)? – user1537779

+0

我不认为有可能从GCM服务器获取该信息。这意味着您将不得不依赖成功接收您的消息的客户端应用程序和服务器之间的另一种通信方法。 您从GCM服务器获得的响应(如您所知)只是让您知道: 成功:已处理的消息数量无错误。 或 失败:无法处理的消息数。 –

+0

'我可能会在我的服务器端标记通知不是通过查看不可用的错误消息发送的,但是无法确定如何将它们标记为GCM成功发送通知后发送的消息'我可能最终再次发送相同的通知if我不知道gcm服务器是否稍后发送它们。 – user1537779

2

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

当客户端收到一条消息时,这个样子,与HATEOAS风格链接:

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

客户端然后进入GET从URI,此时服务器知道它已经交付并可以相应地更新消息的有效载荷。获取有效负载也会将其删除。

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

如果这是矫枉过正,重量轻的做法只是实现消息传递的服务器的认识是有一个简单的方应答与给定ID的消息的接收端点,如

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

{ 
    messageId: <messageId> 
} 
+0

这是一个有趣的方法,但它并不直接回答这个问题。 GCM试图重新投递吗? – Flimm

+1

你说得对。这可能更适合作为评论,但有点太长,我希望它可以帮助某人。 – JHH

相关问题