Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何实现可靠的推送消息服务?_Android_Ios_Push Notification - Fatal编程技术网

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

Android 如何实现可靠的推送消息服务?,android,ios,push-notification,Android,Ios,Push Notification,由于我想在移动应用程序中建立可靠的通信,我能否从第三方推送服务(C2DM、APN、城市飞艇)获得推送失败报告(可能设备处于脱机状态)? 或者我们需要自己构建它?我建议使用推送通知IBM MQTT协议。这足够用于推送通知。 正如Vinay所说,MQTT可以为您提供所需的功能。当客户端连接到服务器时,它可以向服务器注册“最后遗嘱”消息。如果客户端意外断开连接,服务器会将此消息发送到指示其执行的主题 在这个方案中,您的客户机可以向client//status之类的东西发送“online”消息,并将“o

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

我建议使用推送通知IBM MQTT协议。这足够用于推送通知。
正如Vinay所说,MQTT可以为您提供所需的功能。当客户端连接到服务器时,它可以向服务器注册“最后遗嘱”消息。如果客户端意外断开连接,服务器会将此消息发送到指示其执行的主题

在这个方案中,您的客户机可以向client//status之类的东西发送“online”消息,并将“offline”消息注册为同一主题的LWT。然后,您可以拥有一个服务器本地客户端,该客户端监听主题client/+//status,它将知道哪些客户端处于联机状态,哪些处于脱机状态

我想说的是,德库都的演示并不是最好的地方。戴尔·莱恩(Dale Lane)的这篇博文深入了解了在Android上使用MQTT的情况:在

有适合IOS和Android的客户端实现,请参见

的预期目的是为您的服务器应用程序提供一种节省电池的方式,以向移动设备发出信号,表明它希望启动可靠的通信

您可以对消息进行结构化,以便每个新的C2DM包含自上次与服务器双向交互以来发生的所有事情(即,“来获取我所拥有的一切”)。您的交付失败报告隐含在移动设备没有及时响应中(您可以这样做,因为您知道C2DM会有意激活您的应用程序)


这真的比保证在有损介质中传递每条消息更糟糕吗?好吧,更糟糕的是,你还必须实现一个主要的通信方法。但无论如何,您必须这样做,因为C2DM只入站,对吗?

没有一个服务不提供有关推送失败的报告

推送失败报告与APN/C2DM/Hemium没有什么关系

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

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

简单的例子可以说明这一点: 假设在应用程序关闭时收到推送。在这种情况下,将向用户发出通知。但,只有当用户点击该通知时,应用程序才会从推送接收数据!若用户点击应用程序的图标,那个么数据将不会被接收

因此,从技术上讲,推送到iOS设备并启动应用程序,但不传送数据

带有APN和氦气的城市航空

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

根据您的业务需要,可以更轻松地将您的体系结构调整为现有解决方案,然后重新实现推送服务


仔细看看城市航空。事实上,C2DM有一些限制,有时推送消息的传递时间太长。因为UA已经实现了他们自己的传输——氦,所以它工作得相当好。氦是一种付费服务,但UA提供了良好的SLA。

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

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表中


这很容易理解和维护,但我没有用另一种方法进行操作的经验。

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

感谢您的回复!首先竖起大拇指回答问题。谢谢回复!首先竖起大拇指,看看你的答案。下面是另一个用电量比较,这次是https:谢谢!我认为它适用于任何不可靠的基于推送的服务。我将对每个答案进行评估,并为自己选出最佳答案。发送到Android设备的通知可能非常不可靠()。考虑Puxy(),它是一个高度可靠的推送通知网关,旨在通过使用底层MQTT套接字连接来传递通知来解决这个问题。充分披露——我发现了进取心。