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

我最近了解到iPhone应用程序接收几乎即时通知给应用程序 通知的能力 。

这是以推送通知的forms提供的,这是一个定制的协议,它始终保持与iPhone的数据连接,并向应用程序发送二进制数据包,从服务器应用程序发送到电话应用程序0.5到5秒之间,快速popup警报响应时间。 这是作为数据(而不是SMS)发送的,非常小的数据包作为数据计划的一部分而不是作为传入消息收取。

我想知道是否使用Android,有没有类似的设施,或者是否有可能使用Android API来实现接近此目的的东西。 为了澄清,我定义类似于:

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

我很欣赏应用程序可以基于拉,HTTP请求/响应的风格,但理想情况下,我不希望被重罚只是为了检查通知; 除此之外,它像滴水排水的数据计划。

Firebase云消息传递FCM常见问题解答是GCM的新版本。 它inheritance了GCM的核心基础架构,在Android,iOS和Chrome上可靠地传递消息。 不过,他们会继续支持GCM,因为很多开发人员现在都在使用GCM SDK来处理通知,而客户端应用升级需要时间。

截至2012年6月26日, Google Cloud Messaging是向运行在设备上的应用程序发送消息的首选方式。

以前(现在已被弃用),该服务被称为云到设备消息传递 。

XMPP是一个很好的解决scheme。 我已经使用它来实现Android实时应用程序。 XMPPfunction强大,可扩展性强,易于集成和使用。

有大量免费的XMPP服务器(尽pipe出于礼貌你不应该滥用它们),并且有一些开源服务器可以在你自己的盒子上运行。 OpenFire是一个很好的select。

你想要的图书馆不是如上所述的Smack ,这是一个小问题 。 但是请注意,这是一个构build环境 – 您将不得不构build库。

这是我对XMPP解决scheme的电池寿命影响的计算:

Android客户端必须通过周期性唤醒向XMPP服务器发送心跳来维护持续的TCP连接。
这显然会在用电方面带来成本。 这个成本的估计如下:

  • 使用1400mAh电池(Nexus One和HTC Desire提供)
  • 连接到3Gnetworking的空闲设备使用大约5mA
  • 唤醒,心跳,睡眠周期每5分钟发生一次,需要3秒钟完成并使用300mA
  • 因此每小时电池使用成本为:
    • 36秒300mA = 3mAh发送心跳
    • 空闲时3600秒5mA = 5mAh
    • 4:95 + 3 = 7:95mAh
  • 1400mAh的电池在闲置时间约为11.6天,在运行应用程序时约为7.3天,电池寿命缩短约37%。
  • 然而,由于设备几乎没有完全空闲,所以37%的电池寿命缩短表示绝对最坏的情况。

我最近开始玩Android的MQTT http://mqtt.org作为你要求的一种方式(即不是短信,而是数据驱动,几乎即时的消息传递,可扩展,不轮询等)

我有一个博客文章的背景资料,以防万一它有帮助http://dalelane.co.uk/blog/?p=938

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

看看Xtify平台。 看起来这是他们在做什么,

Google正在贬低C2DM,但是在他们介绍GCM(Google Cloud Messaging)的地方,我不认为他们有任何配额和免费! 但它确实需要Android 2.2以上! http://developer.android.com/guide/google/gcm/index.html

如果您可以依赖于Google目标市场的库,那么您可能需要倚重GTalk的function(在现有用户名上注册资源 – 在与BroadcastReceiver进来时拦截它的消息)。

如果没有,我希望你不能 ,那么你打算捆绑你自己的XMPP版本 。 这是一个痛苦,但是如果XMPP作为一个独立的库单独捆绑,可能会变得更容易。

您也可以考虑PubSubHubub ,但我不知道它的networking使用情况。 我相信它是build立在XMPP之上的。

我一直在研究这个和jamesh推荐的PubSubHubBub不是一个选项。 PubSubHubBub用于服务器到服务器通信

“我支持NAT,我可以订阅Hub吗?Hub不能连接到我。

/匿名

不,PSHB是一个服务器到服务器的协议。 如果你在NAT后面,你不是一个真正的服务器。 虽然我们已经对可选的PSHB扩展的想法进行了剔除,但是对于这样的客户端来说,它们并不是在核心规范中进行悬挂获取(“长轮询”)和/或messagebox轮询。 核心规范只是服务器到服务器。

/ Brad Fitzpatrick,旧金山,加利福尼亚州

资料来源: http : //moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (直接链接不可能)

我得出结论,最简单的方法是使用Comet HTTP推送。 这既是一个简单而且很好理解的解决scheme,但它也可以重新用于Web应用程序。

有一个新的开源项目,用来开发一个用于Android上的推送通知的Java库,使用Meteor慧星服务器作为后端。 您可以在Deacon Project博客上查看。 我们需要开发者,所以请传播这个词!

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

随着GTalk从SDK中消失,build立一个“标准”推送消息系统可能是一个好主意。 这样,只有一个服务必须运行,只需要打开一个额外的TCP连接。 应用程序应该使用Intents与此服务对话,并且应该首先请求许可发送和接收来自服务的通知。 然后该服务应该通知用户一个新的应用程序想要发送和接收消息。 然后用户将授予或拒绝许可,所以他保持控制。 然后,应用程序将向服务注册一个动作+类别,以便服务知道如何传递推送的消息。

这个好主意还是不好?

为什么不用XMPP实现呢? 现在有这么多的公共服务器可用,包括GTalk,JABBER,城堡等。对于Android有一个SDK也可以命名为SMACK。 我们不能说推送通知,但使用XMPP,您可以保持客户端和服务器之间的连接,这将允许双向通信。 意味着Android客户端和服务器都可以相互通信。 目前这将满足在Android的Push的需要。 我已经实现了一个示例代码,它真的很好

谷歌最近(2016年5月18日) 宣布 , Firebase现在是移动开发者的统一平台,包括接近实时的推送通知。它也是一个多平台:

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

资源

GCM的问题是,在这个过程中涉及到很多configuration:

  • 你必须添加大量的样板给你的Android应用程序
  • 您需要configuration外部服务器以与GCM服务器通信
  • 你将不得不写testing

如果你喜欢简单的东西(如我),你应该尝试UrbanAhiphip 。 它是(恕我直言)在您的应用程序中使用GCM最简单的方法,而不需要做很多configuration。 它也给你一个漂亮的graphics用户界面来testing你的GCM消息是否正确传递。

  • 您可以在这里find文档和入门指南
  • 您可以在这里find示例应用程序

注意:我不以任何方式隶属于UrbanAirship

他们的听众必须在代码中使用他们的库类。 你不必担心推动。 您必须将消息发送到服务器服务器将消息推送到设备。 他们使用OAuth。 关于协议,有两种使用CCS和XMPP的方法。 CCS只是使用XMPP作为authentication的传输层,因此您可以使用大多数XMPP库来pipe理连接。 要发送通知给设备,您可以在Android应用程序中编写代码以发送以及您的服务器代码。 消息发送只能由您的代码完成。 在GCM情况下,Google服务器会保留其余的部分。 您可以在此链接查看详细信息

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