如何实现可靠的推送消息服务?

时间:2012-05-24 07:44:24

标签: android ios push-notification

由于我想在移动应用程序中建立可靠的通信,我是否可以从第三方推送服务(C2DM,APN,城市飞艇)获得推送失败的报告(可能是设备离线)? 或者我们需要自己构建它?

6 个答案:

答案 0 :(得分:4)

Android C2DM的预期目的是为您的服务器应用提供节省电池的方式,以便向移动设备发出信号,表明它希望开始可靠的通信。

您可以构建您的消息,以便每个新的C2DM包含自上次与服务器的双向交互以来发生的所有事情(即“来得到我得到的任何东西”)。您失败的投放报告隐含在移动设备中未及时响应(您可以执行此操作,因为您知道C2DM会使用意图激活您的应用)。

这是否真的比有损媒体中每封邮件的保证更糟糕?好吧,更糟糕的是你还必须实现主要的通信方法。但是你必须这样做,因为C2DM只是入站的,对吗?

答案 1 :(得分:2)

正如Vinay所说,MQTT可能会为您提供您想要的功能。当客户端连接到服务器时,它可以向服务器注册“遗嘱和遗嘱”消息。如果客户端意外断开连接,服务器会将此消息发送到指示它执行的主题。

在此方案中,您的客户端可以向客户端//状态发送“在线”消息,并将消息“离线”注册为同一主题的LWT。然后,您可以拥有一个服务器本地客户端,该客户端可以监听主题客户端/ + / status,并且可以知道哪些客户端在线以及哪些客户端处于脱机状态。

我建议tokudu演示不是最好看的地方。 Dale Lane的这篇博文提供了在Android上使用MQTT的见解:http://dalelane.co.uk/blog/?p=1599并且在http://stephendnicholas.com/archives/219

对MQTT的电源使用情况进行了审核(同样在Android上)

有适合​​IOS和Android的客户端实现,请参阅http://mqtt.org/software

答案 2 :(得分:2)

没有任何一项服务不提供有关失败推送的报告。

推送报告失败对APN / C2DM / Helium的影响很小

所有服务都旨在提供所有情况下的推送信息。 如果设备现在处于脱机状态,则当设备联机时将推送推送。

此外,对于iOS,推送消息只是用户的通知,而不是应用程序!

简单案例将说明: 假设在关闭应用程序时收到推送。在这种情况下,将发生用户通知。但是,只有当用户点击该通知时,应用程序才会从推送中接收数据!如果用户点击应用程序的图标,则不会收到数据。

因此,技术上,推送已传送到iOS设备并启动应用程序,但未传送数据。

使用APN和Helium的UrbanAirhip

您可以考虑为推送实现自己的传输。 MQTT似乎是一个不错的选择。 但在这种情况下,您必须处理Keepalive,设备睡眠和电池优化。 所有这些艰苦的工作已经由Apple,Google和UrbanAirship的工程师完成。

根据您的业务需求,您可以更轻松地针对现有解决方案调整架构,然后再次重新实现推送服务。

仔细看看UrbanAirship。事实上,C2DM有一些限制,有时候推送消息的传递时间太长。由于UA已经实施了自己的运输 - 氦气,它的效果非常好。 Helium是一项付费服务​​,但UA提供了良好的SLA。

答案 3 :(得分:1)

我建议使用推送通知IBM MQTT协议。这足够用于推送通知。 请参阅https://github.com/tokudu/AndroidPushNotificationsDemo

中的演示

答案 4 :(得分:1)

我做了类似的事情,我有一个数据库跟踪已知订阅者的推送队列,并在失败时进行报告。这很简单,就像这样......

The schema was like so:

pushMessages
  messageID  , GUID, PK
  message , nvarchar (256),
  expires , datetime

messageQueues
  subscriberID , GUID, PK
  messageID , GUID PK

failedPushMessages
  subscriberID, GUID, PK
  messageID , GUID PK

(subscriber table omitted)

一旦客户端成功收到消息,客户端将ping回推送服务器并通过推送通知上收到的唯一queueItems ID通知它。还有一个每日数据库进程可以检查过期的推送消息。找到后,它会在与messageID匹配的queueMessages上进行连接,然后将其从messagesQueues表中删除,并将它们复制到failedPushMessages表中。

这很容易理解和维护,但我没有相反的经验。

答案 5 :(得分:0)

推送服务是提醒用户的有效且可靠的方式。它们甚至允许后台应用程序实时通知用户新信息。推送服务广泛用于移动应用中的各种领域,例如天气更新,消息服务,邮件通知,优惠券服务等。推送服务不再是可选的,而是必不可少的。