354

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

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

我想知道,使用 Android 是否有类似的设施,或者是否可以使用 Android API 实现与此类似的东西。为了澄清,我将类似定义为:

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

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

4

16 回答 16

220

Firebase Cloud Messaging FCM FAQ是 GCM 的新版本。它继承了 GCM 的核心基础架构,可以在 Android、iOS 和 Chrome 上可靠地传递消息。但是他们会继续支持 GCM,因为现在很多开发人员都在使用 GCM SDK 来处理通知,而且客户端应用程序升级需要时间。

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

以前(现在已弃用),该服务称为Cloud To Device Messaging

于 2010-05-28T17:08:52.237 回答
51

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

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

您想要的库不是上面提到的Smack,而是aSmack。但请注意,这是一个构建环境 - 您必须构建库。

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

Android 客户端必须通过定期唤醒以向 XMPP 服务器发送心跳来维持持久的 TCP 连接。
这显然会在电力使用方面产生成本。该费用的估算如下:

  • 使用 1400mAh 电池(在 Nexus One 和 HTC Desire 中提供)
  • 连接到 3G 网络的空闲设备使用大约 5mA
  • 唤醒、心跳、睡眠周期每 5 分钟发生一次,需要 3 秒才能完成并使用 300mA
  • 因此,每小时的电池使用成本为:
    • 36 秒 300mA = 3mAh 发送心跳
    • 3600 秒 5mA = 5mAh 空闲
    • 4:95 + 3 = 7:95mAh 组合
  • 一块 1400mAh 的电池在空闲状态下可持续使用约 11.6 天,在运行应用程序时可持续使用 7.3 天,这意味着电池寿命减少了约 37%。
  • 然而,考虑到设备很少完全空闲,电池寿命减少 37% 代表了实践中绝对最坏的情况。
于 2011-04-17T19:26:54.083 回答
34

我最近开始使用适用于 Android 的 MQTT http://mqtt.org来满足您的要求(即不是 SMS,而是数据驱动,几乎是即时消息传递,可扩展,不是轮询等)

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

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

于 2009-09-30T22:53:40.610 回答
14

看看Xtify平台。看起来这就是他们正在做的,

于 2010-03-01T04:19:44.173 回答
12

谷歌正在贬低 C2DM,但他们引入了 GCM(谷歌云消息传递),我认为他们没有任何配额而且它是免费的!它确实需要Android 2.2+!http://developer.android.com/guide/google/gcm/index.html

于 2012-06-28T00:44:31.577 回答
8

有一项新的开源工作是使用 Meteor comet 服务器作为后端来开发用于在 Android 上推送通知的 Java 库。您可以在Deacon 项目博客上查看它。我们需要开发人员,所以请宣传!

于 2010-04-17T02:49:47.573 回答
8

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

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

/匿名的

不,PSHB 是一种服务器到服务器的协议。如果你在 NAT 之后,你就不是真正的服务器。虽然我们已经提出了可选的 PSHB 扩展来为此类客户端执行挂起获取(“长轮询”)和/或消息框轮询的想法,但它不在核心规范中。核心规范仅适用于服务器到服务器。

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

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

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

于 2009-10-21T11:28:10.440 回答
8

如果您可以依靠 Google 库为您的目标市场提供服务,那么您可能想要搭载 GTalk功能(在现有用户名上注册资源 - 在消息通过 BroadcastReceiver 进入时拦截它)。

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

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

于 2009-08-20T11:36:41.680 回答
8

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

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

资源

于 2016-05-26T06:21:04.163 回答
6

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

于 2009-08-07T22:44:04.637 回答
6

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

于 2010-04-16T11:09:45.677 回答
6

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

这是个好主意吗?

于 2010-03-22T21:44:50.943 回答
6

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

于 2010-08-03T10:33:37.987 回答
4

GCM的问题在于过程中涉及到很多配置:

  • 您必须向您的 Android 应用程序添加大量样板文件
  • 您需要配置外部服务器以与 GCM 服务器通信
  • 您将不得不编写测试

如果你喜欢简单的东西(比如我),你应该试试UrbanAirship。这是(恕我直言)在您的应用程序中使用 GCM 的最简单方法,无需进行大量配置。它还为您提供了一个漂亮的 GUI 来测试您的 GCM 消息是否正确传递。

注意:我与 UrbanAirship 没有任何关系

于 2013-08-22T21:43:41.280 回答
2

https://github.com/Guti/Google-Cloud-Messaging--Titanium-/blob/master/src/com/google/android/gcm/GCMRegistrar.java

它是非常好的和有效的推送解决方案。

请尝试一下

于 2014-04-17T12:41:17.800 回答
2

他们有他们的监听器,你必须通过在你的代码中使用他们的库类来使用它们。你不必为推动而烦恼。您必须将消息发送到服务器服务器会将消息推送到设备。他们使用 OAuth。关于协议,有两种使用 CCS 和 XMPP 的方法。CCS 只是将 XMPP 用作经过身份验证的传输层,因此您可以使用大多数 XMPP 库来管理连接。要将通知发送到设备,您可以在 android 应用程序中编写代码以发送以及您的服务器代码。消息发送将仅由您的代码完成。在 GCM 情况下,Google Server 将负责休息。您可以在此链接查看详细信息

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

于 2014-05-21T17:57:36.013 回答