由于我想在移动应用程序中建立可靠的通信,我是否可以从第三方推送服务(C2DM,APN,城市飞艇)获得推送失败的报告(可能是设备离线)? 或者我们需要自己构建它?
答案 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)
推送服务是提醒用户的有效且可靠的方式。它们甚至允许后台应用程序实时通知用户新信息。推送服务广泛用于移动应用中的各种领域,例如天气更新,消息服务,邮件通知,优惠券服务等。推送服务不再是可选的,而是必不可少的。