【问题标题】:Does Android support near real time push notification?Android 是否支持近乎实时的推送通知?
【发布时间】:2010-11-17 14:27:24
【问题描述】:

我最近了解到 iPhone 应用程序能够接收几乎即时的notifications to apps notifications to apps

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

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

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

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

【问题讨论】:

  • gmail 和 gchat 的通知通常在该阈值内。应该有一种方法可以在您自己的应用中复制它。
  • 是的,有一个 android 库可以使推送消息变得非常简单...只需在您的应用程序中包含 Jigy's Droid Notifications 库,然后从那里它只有大约 10 行代码...希望这会有所帮助 :)
  • 查看 Pushy (pushy.me) 了解实时推送通知网关,该网关在后台使用 MQTT 以提高可靠性。全面披露——我创立了 Pushy。

标签: android push-notification


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

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

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

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

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

  • 使用 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% 代表绝对最坏的情况 实际上,鉴于设备很少完全空闲。

【讨论】:

  • 但实际上,当应用程序执行此操作时,手机将持续 3 小时,因为当手机唤醒或显示屏打开或网络状态更改时会运行数百个意图。
【解决方案3】:

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

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

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

【讨论】:

  • mqtt 是怎么做到的?一定有某个地方涉及一些民意调查?甚至苹果也必须轮询,但我认为他们一次只做一个连接,因此不会消耗太多电池......
  • 它通过打开 TCP/IP 连接并保持打开状态来实现。它不进行轮询,但它确实必须偶尔向连接发送一条小的 ping 消息以保持连接状态。
  • 如果通过 Google 发送推送消息让您感到不舒服,MQTT 绝对是您的最佳选择。此外,我们与客户签订了保密协议,禁止使用云服务进行数据交换。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      如果您可以依赖为您的目标市场提供的 Google 库,那么您可能希望搭载 GTalk 功能(在现有用户名上注册资源 - 将消息拦截为它们带有一个广播接收器)。

      如果不是,我希望you can't,那么您将进入捆绑您自己的 XMPP 版本。这很痛苦,但如果将 XMPP 单独捆绑为独立库,可能会更容易。

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

      【讨论】:

      • 我认为文章统计只要设备上有 gtalk 库,搭载功能将始终可用。您是否有一些资源以及如何实际做到这一点的示例?
      • GTalk 自 1.0 (iirc) 起已从 SDK 中移除。
      【解决方案7】:

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

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

      /匿名

      不,PSHB 是服务器到服务器 协议。如果你在 NAT 后面,你就是 不是真正的服务器。虽然我们已经 围绕可选 PSHB 的想法展开 做挂起的扩展(“长 polling") 和/或消息框轮询 对于这样的客户,它不是核心 规格。核心规格是 仅限服务器到服务器。

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

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

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          Google 最近(18May2016)announcedFirebase 现在是移动开发人员的统一平台,包括近乎实时的推送通知。它也是多平台的:

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

          source

          【讨论】:

            【解决方案10】:

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

            【讨论】:

            • joelapenna.com/blog/2009/07/android-foursquare-and-push 有一个似乎支持这一点的 Android 应用程序的开发者的博文。
            • 这些在我看来,他们也在投票。移动设备与服务器建立连接并通知服务器它正在等待更新。实际推送是由服务器发起的,这对于移动设备来说难度很大,而且大部分时间都涉及到网络提供商的支持(短信/wap推送)...
            • “C2DM 允许第三方开发者使用与 Google 应用相同的服务。”从 Android 云到设备消息传递
            【解决方案11】:

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

            这个主意好不好?

            【讨论】:

              【解决方案12】:

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

              【讨论】:

              • 愿意提供指向您的示例代码的链接吗?做过关于电池寿命的测试吗?
              • 我已经对电池寿命进行了测试 - 在最坏的情况下,您需要每 6 分钟发送一次心跳会减少 30% 的电池寿命(即设备只会唤醒发送心跳)。在最好的情况下(用户正在使用设备进行浏览、通话等),对电池寿命的影响可以忽略不计。
              【解决方案13】:

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

              【讨论】:

                【解决方案14】:

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

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

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

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

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

                【讨论】:

                  【解决方案15】:
                  【解决方案16】:

                  他们有他们的监听器,你必须通过在你的代码中使用他们的库类来使用它们。你不必为推动而烦恼。您必须将消息发送到服务器服务器将消息推送到设备。他们使用 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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-05-06
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-08-09
                    相关资源
                    最近更新 更多