Android是否支持近实时推送通知?


343

我最近了解了iPhone应用程序能够接收几乎即时的应用程序 通知的功能

它以推送通知的形式提供,这是一个定制协议,可始终保持与iPhone的数据连接,并向应用程序发送二进制数据包消息,从服务器应用程序发送到电话应用程序后0.5-5秒之间,它会迅速以惊人的速度弹出警报响应时间。这是作为数据而不是SMS发送的,以非常小的数据包形式发送,这些数据包是数据计划的一部分,而不是传入消息。

我想知道,如果使用Android,是否有类似的功能,或者是否有可能使用Android API来实现与此类似的功能。为了澄清起见,我将类似定义为:

  • 不是短信,而是一些数据驱动的解决方案
  • 尽可能实时
  • 具有可扩展性,即作为移动应用程序的服务器部分,我可以在几秒钟内通知数千个应用程序实例

我很欣赏该应用程序可能是基于请求的HTTP请求/响应样式,但理想情况下,我不想为了检查通知而进行大量轮询;除此之外,这就像滴水沥干数据计划一样。


3
gmail和gchat的通知通常在该阈值之内。应该有一种方法可以在您自己的应用程序中复制它。
Dana the Sane

是的,有一个使推送消息非常简单的android库...只需在您的应用程序中包含Jigy的Droid Notifications库,然后从那里开始只有大约10行代码...希望对您有所帮助:)
Corey Harden

请访问Pushy(pushy.me)获得实时推送通知网关,该网关在后台使用MQTT来提高可靠性。全面披露-我创立了Pushy。
伊拉德·纳瓦

Answers:


215

Firebase Cloud Messaging FCM常见问题解答是GCM的新版本。它继承了GCM的核心基础架构,可在Android,iOS和Chrome上可靠地传递消息。但是,他们将继续支持GCM,因为当今许多开发人员都在使用GCM SDK来处理通知,并且客户端应用程序升级需要时间。

自2012年6月26日起,Google Cloud Messaging是将消息发送到设备上运行的应用程序的首选方式。

以前(现已不推荐使用),该服务称为Cloud To Device Messaging


14
Google通过code.google.com/android/c2dm提供了详细的文档,以将其实现到您的Java Java应用中,但缺少与C2DM服务器端通信的示例代码。我在这里写了该方面的教程:blog.boxedice.com/2010/10/07/...
DavidM

2
有没有一种方法可以向使用Android 2.2的用户提供推送通知,但是可以在没有推送通知的情况下使同一应用在旧版本上运行呢?
OneWorld 2010年

3
@OneWorld:是的,就像任何其他Android向后兼容技术,使用反射来接备用策略时C2DM是不可用的,更多见:developer.android.com/resources/articles/...
烈瑞恩

1
developer.android.com/videos/index.html#v=PLM4LajwDVc关于推送通知的Google I / O 2010演示文稿
vokilam,2011年

6
C2DM已于2012年6月26日正式弃用,请使用[Android的Google Cloud Messaging](developer.android.com/guide/google/gcm/index.html代替
Mithun Sreedharan

47

XMPP是一个很好的解决方案。我已将其用于支持推送的实时Android应用程序。XMPP功能强大,高度可扩展且易于集成和使用。

有很多免费的XMPP服务器(尽管出于礼貌,您不应该滥用它们),并且有一些开源服务器可以在自己的一个机器上运行。OpenFire是一个绝佳的选择。

您想要的库不是如上所述的Smack,而是aSmack。但是请注意,这是一个构建环境-您将必须构建库。

这是我对XMPP解决方案对电池寿命的影响所做的计算:

Android客户端必须通过定期唤醒以将心跳发送到XMPP服务器来维持持久的TCP连接。
显然,这在功率使用方面带来了成本。下面提供了此费用的估算:

  • 使用1400mAh电池(由Nexus One和HTC Desire提供)
  • 连接到3G网络的空闲设备使用大约5mA的电流
  • 唤醒,心跳,睡眠周期每5分钟发生一次,需要三秒钟才能完成,并使用300mA
  • 因此,每小时电池使用成本为:
    • 36秒300mA = 3mAh发送心跳
    • 3600秒5mA = 5mAh闲置
    • 4:95 + 3 = 7:95mAh
  • 1400mAh电池在空闲状态下可持续使用约11.6天,在运行该应用程序时可持续7.3天,相当于将电池寿命降低了约37%。
  • 但是,考虑到设备很少完全处于闲置状态,将电池寿命减少37%代表了实际中的最坏情况。

2
但是,实际上,应用程序执行此操作后,电话将持续3个小时,因为当电话唤醒或显示开关打开或网络状态更改时,会运行数百个意图。
星期一

33

最近,我开始使用Android的MQTT http://mqtt.org进行操作,以完成您所要的事情(即,不是SMS,而是数据驱动,几乎立即的消息传递,可伸缩,不轮询等)。

我有一篇有关此背景信息的博客文章,以防有帮助http://dalelane.co.uk/blog/?p=938

(注意:MQTT是一种IBM技术,我应该指出我为IBM工作。)


mqtt如何做到这一点?在某处必须进行某些轮询吗?甚至苹果也必须进行投票,但我认为他们一次只能建立一个连接,因此不会消耗太多电量……
Janusz 2010年

3
它通过打开TCP / IP连接并使其保持打开状态来实现。尽管确实必须偶尔在连接上发送一条小的ping消息以使其保持活动状态,但它不会轮询。
dalelane 2011年

如果通过Google发送推送消息使您感到不舒服,那么绝对可以使用MQTT。此外,我们与客户签订了保密协议,禁止使用云服务进行数据交换。
VH-NZZ



8

如果您可以依赖目标市场的Google图书馆,那么您可能希望使用GTalk功能(在现有用户名上注册资源-在广播用户收到广播消息时对其进行拦截)。

如果不是,并且我希望您不能这样做,那么您将不得不捆绑自己的XMPP版本。这很痛苦,但是如果XMPP作为独立的库单独捆绑在一起,则可能会更容易。

您可能还会考虑PubSubHubub,但我不知道它的网络使用情况。我相信它是建立在XMPP之上的。


我认为文章统计信息说,只要gtalk库在设备上,背back功能将始终可用。您是否有一些示例资源,如何实际做到这一点?
Janusz 2010年

从1.0(iirc)开始,GTalk已从SDK中删除。
Mrsnowflake

8

我一直在研究,jamessh推荐的PubSubHubBub不是一个选择。PubSubHubBub用于服务器到服务器的通信

“我在NAT后面。我可以订阅集线器吗?集线器无法连接到我。”

/匿名

不,PSHB是服务器到服务器的协议。如果您落后于NAT,那么您实际上不是服务器。尽管我们已经提出了一些可选PSHB扩展的想法,以便为此类客户端进行挂起获取(“长时间轮询”)和/或消息框轮询,但这并不是核心规范。核心规格仅是服务器到服务器。

/布拉德·菲茨帕特里克(Brad Fitzpatrick),加利福尼亚州旧金山

来源:http : //moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d(无法建立直接链接)

我得出的结论是,最简单的方法是使用Comet HTTP push。这既是一种简单且易于理解的解决方案,但也可以重新用于Web应用程序。


8

有一个新的开放源代码工作,即使用Meteor彗星服务器作为后端,在Android上开发用于推送通知的Java库。您可以在Deacon项目博客中查看。我们需要开发人员,所以请大声疾呼!


7

谷歌最近(18May2016)宣布,火力地堡是现在统一为移动开发者,包括近实时推送notifications.It平台也多平台:

该公司现在为所有Firebase用户免费提供无限制的通知,并支持iOS,Android和Web。

资源


6

我在哪里找不到我的书,但是我相信gmail利用开放的TCP连接来进行电子邮件推送。


Android应用程序的开发人员在joelapenna.com/blog/2009/07/android-foursquare-and-push上有一篇博客文章,似乎支持此内容。
dalelane

这些在我看来,他们也在投票。移动设备与服务器建立连接,并通知服务器正在等待更新。实际的推送是由服务器启动的,这对于移动设备而言非常困难,并且大部分时间都涉及网络提供商的支持(SMS / WAP推送)...
MrSnowflake 2010年

1
“ C2DM允许第三方开发人员使用与Google应用相同的服务。” 从Android Cloud到设备消息传递
colithium 2010年

6

就像GTalk从SDK过去的那样,制作一个“标准”推送消息系统可能是一个好主意。这样,仅需运行一项服务,只需打开一个额外的tcp连接即可。应用程序应使用此服务与之对话,Intents并应首先请求允许从该服务发送和接收通知的权限。然后,服务应通知用户新的应用程序要发送和接收消息。然后,用户将授予或拒绝权限,因此他将保持控制。然后,应用程序将向该服务注册一个动作+类别,因此该服务知道如何传递推送的消息。

一个好主意吗?


6

您为什么不使用XMPP实现。现在有很多可用的公共服务器,包括gtalk,jabber,citadel等。对于Android,也有一个名为SMACK的SDK。我们不能说是推送通知,但是使用XMPP可以使客户端和服务器之间的连接保持打开状态,这将允许双向通信。意味着Android客户端和服务器都可以相互通信。目前,这将满足Android中Push的需求。我已经实现了示例代码,它确实很棒


是否愿意提供指向您的示例代码的链接?是否进行过有关电池寿命的测试?
亚历克斯

我已经对电池寿命进行了测试-在最坏的情况下,每六分钟需要发送一次心跳将使电池寿命减少30%(即,设备仅在唤醒后才能发送心跳)。在最佳情况下(用户使用设备进行浏览,通话等),对电池寿命的影响可以忽略不计。

6

我最近开发了http://pushdroid.org,它是一个应安装在手机上的应用程序,就像google已在2.2中实现它一样,这是从1.5开始并通过意图进行广播的。


4

GCM的问题在于,该过程涉及很多配置:

  • 您必须向Android应用程序添加很多样板
  • 您需要配置外部服务器以与GCM服务器通信
  • 您将必须编写测试

如果您喜欢简单的东西(例如我),则应尝试UrbanAirship。这是(IMHO)在您的应用中无需进行大量配置即可使用GCM的最简单方法。它还为您提供了一个漂亮的GUI,以测试您的GCM消息是否正确传递。

  • 您可以在此处找到文档和入门指南
  • 您可以在此处找到示例应用程序

注意:我不以任何方式加入UrbanAirship



2

他们有自己的侦听器,您必须通过在代码中使用其库类来使用它们。您不必费心去推动。您必须将消息发送到服务器,服务器会将消息推送到设备。他们使用OAuth。关于协议,有两种使用CCS和XMPP的方法。CCS仅将XMPP用作经过身份验证的传输层,因此您可以使用大多数XMPP库来管理连接。要将通知发送到设备,您可以在android应用中编写要发送的代码以及服务器代码。消息发送仅由您的代码完成。Google服务器在GCM情况下会妥善处理。您可以在此链接上查看详细信息

http://developer.android.com/google/gcm/server.html

另外,对于安全问题

谷歌云消息传递安全https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

如果您的应用未运行,则设备也可以接收通知,因为您必须为广播侦听器编写代码。在后台它将监听服务器,并且每当有消息包出现时,它将接收该消息作为通知。Android提供了您无需理会的服务。您只需要使用库类来使用这些资源,这会使您的工作更轻松,并且如果您的应用未运行,则让它们编写代码,它也可以接收通知。显然,会有一些听众鞭打使该应用程序接收。选中此链接中的“接收消息”部分

http://developer.android.com/google/gcm/client.html

它也将接受用户的请求。对于GCM,它将成功。请检查“发送消息”

http://developer.android.com/google/gcm/client.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.