新闻

首页 >  新闻

Android推送方式的解决方案

日期: 来源:蛙合游戏
本文介绍了Android中实现push方法的基础知识和相关解决方案。 推送功能越来越多地应用于手机开发中。 不出意外的话,我们手机上的新闻客户端会时不时的推送新的新闻,阅读最新的新闻资讯非常方便。 这种推送功能是个好东西,但是我们经常会看到推送很多垃圾信息,让我们感觉很累。 对此我们不能说太多。 毕竟,很多企业都想做广告。 本文就是讨论Android中实现推送功能的一些解决方案,希望能够作为一个切入点。 ^_^

1.推送方式基础知识:

在移动互联网时代之前的手机中,如果发生了需要通知用户的事情,就会弹出一个窗口告诉用户发生了什么事。 它可能是未接来电提醒、日历提醒或新的彩信。 推送功能最早是用在电子邮件中,用来提醒我们新的信息。 由于时代的发展和移动互联网的蓬勃发展,推送功能变得更加流行。 它不再仅仅用于推送电子邮件,而是更多地用于我们的应用程序中。

当我们开发需要与服务器交互的应用程序时,基本上都需要获取服务器端的数据。 例如“地震紧急通知”需要及时获取服务器上最新的地震信息。 要获取服务器上不时更新的信息,一般有两种方法:第一种是在客户端使用Pull方法,即每隔一段时间去服务器获取信息,看看是否有有更新信息。 出现。 第二种方法是服务器使用Push。 当服务器有新信息时,将最新信息推送给客户端。 这样客户端就可以自动接收到消息了。

虽然Pull和Push方式都可以实现获取服务器端更新信息的功能,但Push方式明显优于Pull方式。 因为Pull方式在客户端消耗的网络流量较多,更重要的是电量,所以也需要我们的程序不断监控服务器上的变化。

在开发Android和iPhone应用程序时,我们经常需要将各种通知消息从服务器实时推送到移动客户端。 我们只需要在Android或iPhone的通知栏上下拉即可展开通知面板,我们可以一目了然地查看各种通知消息。 目前,IOS平台上已经有比较简单、完善的推送通知解决方案。 稍后我会详细介绍iPhone中的解决方案,但在Android平台上实现起来相对麻烦。

最近花了几天时间对Android的推送通知服务进行了初步研究,希望和大家一起讨论。

2、几种常见方案的实现原理:

1)轮询(Pull)方法:应用程序应定期连接到服务器并查询是否有新消息到达。 你必须自己实现与服务器的通信,比如消息队列等,并且还需要考虑轮询的频率。 如果太慢,可能会导致某些消息延迟。 如果太快,会消耗大量的网络带宽和电池。

2)短信(Push)方式:在Android平台上,可以通过拦截短信并解析消息内容来了解​​服务器的意图,并获取其显示内容进行处理。 这是一个好主意,我见过使用这种方法的应用程序。 该方案的优点是可以实现完全的实时操作。 但问题是这种方案的成本比较高,我们需要向移动公司支付相应的费用。 目前我们很难找到一个免费的短信发送网关来实现这个解决方案。

3)持久连接(Push)方式:该方案可以解决轮询带来的性能问题,但仍然会消耗手机的电池。 iOS平台上的推送服务效果很好,因为每部手机只与服务器保持一个连接。 事实上,C2DM也是这样运作的。 但正如刚才提到的,这个方案有很多缺点,就是我们很难在手机上实现可靠的服务,目前还无法与IOS平台的推送功能相比。

Android操作系统允许在内存不足时杀死系统服务,因此我们的推送通知服务很可能会被操作系统杀死。 轮询(Pull)方式和短信(Push)方式两种方案也存在明显的缺点。 至于长连接(Push)方案,也有缺点,但我们可以通过良好的设计来弥补,使方案能够有效地发挥作用。 毕竟我们要知道GMail、GTalk和GoogleVoice都可以实现实时更新。

3、第一种方案:C2DM云推送功能。

在Android移动平台上,Google提供了C2DM(Cloud to Device Messaging)服务。 一开始我打算用这个服务来实现我手机上的推送功能,并把它引入到我的项目中。

Android 云到设备消息传递 (C2DM) 是一项帮助开发人员将数据从服务器发送到 Android 应用程序的服务。 该服务提供了一种简单、轻量级的机制,允许服务器通知移动应用程序直接与服务器通信,以便从服务器获取应用程序更新和用户数据。 C2DM 服务负责处理诸如消息排队之类的事情,并将这些消息分发到目标设备上运行的应用程序。 关于C2DM的具体使用流程,您可以查看相关资料。 在这里,我们先来了解一下总体规划。

下面是C2DM操作流程示例图:

Android推送方式的解决方案

但经过一番研究,发现这项服务存在很大的问题:

1)C2DM内置于Android 2.2系统中,不兼容旧的1.6至2.1系统;

2)C2DM需要依赖Google官方提供的C2DM服务器。 由于国内网络环境原因,该服务经常无法使用。 如果我们想用好的话,我们的App Server也必须在国外。 恐怕不是每个开发者都能做到这一点。 可以实现的;

3)与iPhone不同的是,它们将硬件系统集成在一起。 所以对于我们开发者来说,如果我们想在自己的应用中使用C2DM的推送功能。因为对于不同的硬件厂商平台,比如摩托罗拉、华为、中兴做手机,他们可能会使用Google的Remove服务,特别是有在中国很多,删除像谷歌这样的原生服务。 如果你购买一些山寨手机或者华为之类的国产手机,谷歌服务可能无法使用。 而像那些出国的可能是内置的。

由于以上的限制,我最终放弃了这个计划。 不过我想用另一篇文章来详细介绍C2DM的框架以及客户端和App Server相应的设置方法。 它可以作为我们的学习资源。 参考信息。 由于C2DM无法满足我们的要求,所以我们需要自己实现Android手机客户端与App Server之间的通信协议,以保证当App Server想要向指定的Android设备发送消息时,Android设备能够及时收到。 。

4、方案二:MQTT协议实现Android推送功能。

使用MQTT协议实现Android推送功能也是一种解决方案。 MQTT 是一种轻量级的消息发布/订阅协议,是实现基于移动客户端的消息推送服务器的理想解决方案。

wmqtt.jar是IBM提供的MQTT协议的实现。 我们可以从这里()下载该项目的示例代码,并且可以找到用PHP编写的服务器端实现()。

架构如下图所示:

Android推送方式的解决方案

wmqtt.jar是IBM提供的MQTT协议的实现。 我们可以从以下站点下载()它。 我们可以将这个jar包添加到我们自己的Android应用程序中。

5、第三种方案:RSMB实现推送功能。

IBM 还提供了Really Small Message Broker (RSMB),它是一个简单的MQTT 代理。 其查看地址为:。 1883端口默认打开。 在应用程序中,它负责从服务器接收消息并将其转发到指定的移动设备。

SAM 是为 MQTT 编写的 PHP 库。 我们可以从这个0地址下载。

send_mqtt.php 是一个 PHP 脚本,它通过 POST 接收消息并通过 SAM 将它们发送到 RSMB。

6、第四种方案:XMPP协议实现Android推送功能。

这是我希望在项目中采用的解决方案,因为它目前是开源的,仍然可以实现其简单的推送功能。 我们可以修改它的源代码以适合我们的应用程序。

事实上,Google官方的C2DM服务器底层也是使用XMPP协议进行封装的。 XMPP(可扩展通信和表示协议)是一种基于可扩展标记语言 (XML) 的协议,用于即时消息 (IM) 和存在检测。 该协议最终可能允许互联网用户向互联网上的其他任何人发送即时消息。 我在上一篇博文中介绍了 XMPP 协议。 您可以参考以下文章:

androidpn是一个基于XMPP协议的java开源Android推送通知实现。 我将在以后的博文中详细介绍androidpn。 它包含完整的客户端和服务器。 经过研究源码,发现服务端基本是基于另一个开源项目openfire修改实现的。 不过比较郁闷的是androidpn的文档是用韩文写的,所以整个研究过程基本都是以阅读源码为主。

这是androidpn的项目主页:

androidpn的实现意图如下图所示:

Android推送方式的解决方案

androidpn客户端需要使用基于Java的开源XMPP协议包asmack。 这个包也是基于 openfire 下的另一个开源项目 smack 的。 然而,我们不需要自己编译它。 我们可以直接在androidpn客户端中获取asmack.jar。 使用。 客户端使用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过此连接进行用户注册和登录认证。 也正是通过这个连接,它接收服务器发送的通知。

androidpn服务器也是用Java语言实现的,基于openfire开源项目。 不过它的Web部分采用的是spring框架,与openfire不同。 Androidpn 服务器由两部分组成。 一种是监听5222端口的XMPP服务,负责与客户端的XMPPConnection类进行通信。 其功能是用户注册和身份认证,以及发送推送通知消息。 另一部分是Web服务器,它使用轻量级的HTTP服务器,负责接收用户的Web请求。 服务器架构如下:

最顶层包含四个组件,即SessionManager、Auth Manager、PresenceManager 和Notification Manager。 SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器推送消息的功能给客户。

该解决方案的最大优点是其简单性。 我们不需要像C2DM那样依赖操作系统版本,也不用担心有一天Google服务器不可用。 利用XMPP协议,我们可以进一步扩展协议,实现更完整的功能。 使用这个方案,目前我们只能发送短信,但是对于推送来说一般来说已经足够了,因为我们不能指望通过推送来获取所有的数据。 一般情况下,使用推送只是告诉手机服务器发生了某些变化。 客户端收到通知后,应主动去服务器获取最新数据。 这就是推送服务的完整实现。 XMPP协议比较简单,值得进一步研究。

但经过一段时间的测试,我发现androidpn存在一些缺点:

1、例如时间过长,您将不再收到推送信息。

2、性能不够稳定。

3. 如果消息从服务器推送出去,则无论消息是否成功到达客户端手机,都将不再被管理。

等等,总之androidpn也有很多缺点。 如果我们想要使用androidpn,我们还需要做很多工作。

至于详细的使用过程,我们会在下一篇博文中为大家介绍。

7、第五种解决方案:使用第三方平台。

第三方平台有商业的也有免费的,我们可以根据实施情况使用。 关于国内的第三方平台,我感觉目前比较好的就是极光推送。 关于极光推送,目前是免费的,我们可以直接使用。 详细内容可以查看其主页:http://www.cnblogs.com/archive/2011/09/17/14/15/14/12/12/12/10/11/12/12/14/12/12/10/11/2017/12/10/2017/2017/2017/101007.html,这里不再详细介绍。

我也看到过几个国外的第三方平台:。 有兴趣的朋友可以查一下相关资料。 使用第三方平台需要使用别人的服务器。 你知道这个。

8、第六种解决方案:自己搭建推送平台。

这并不是一件容易的事,当然可以根据个人需求采取适当的解决方案。

好了,以上就是Android中实现push方法的基础知识和相关解决方案了。

参考:

1. 推送服务介绍

消息推送,顾名思义,是由一方发起,另一方通过某种方式与发起方建立连接并接收消息。 在Android开发中,这里的发起者称为Push Server,接收者称为Client。 与轮询获取新消息或通知相比,推送在客户端资源消耗和设备功耗方面都优于轮询。 因此,目前需要及时推送消息的应用大多采用Push。 消息通知的方法。

你在天堂,在墙内! Android生态系统最初提供了类似于Apple iOS推送服务APNS的GCM(Google Cloud Messaging for Android),以前称为C2DM。 但由于某些原因,这项服务在中国不太好用。 为了弥补这个缺点,而且同胞们又想重新使用Android推送服务,所以国内各大平台都陆续推出了GCM的替代品。 今天我要介绍的就是其中之一,百度提供的云推送。 此外,国内新闻推送服务有极光推送、个人推送等,其客户包括新浪微博、淘宝等国内大型企业。

推送实现技术简单来说就是利用Socket来维持Client和Server之间的TCP长连接。 这样,可以大大减少轮询方式造成的Device的功耗和数据访问流量。 目前,百度云推送提供的推送服务支持单条消息体大小为4k。 如果超过4k,建议第二次请求时在消息中携带服务请求URL。 目前,百度云推送为Android提供通知推送、短信推送和富媒体推送。

二、使用场景 1、单播消息推送

Push Server 将消息推送到指定的设备(Device)或用户(User)。 一个用户对应一个userID。 一个用户可能有多个设备。 我们希望当向同一个userID推送消息时,他所有与该userID绑定的Device都可以收到该消息。 百度云推送提供的解决方案是通过Client向Push Server注册,并在Client的监听端口获取Push Server返回的channelID和userID。 ChannelID指定终端。 在向推送服务器注册过程中,设备可以发送 IMIE 代码。 或者使用UUID作为唯一标识,注册后将Client生成的channelID和userID返回给Push Server。获得这两个ID后,由开发者自己维护。 注册完成后,Push Server 会维护一个已注册设备的列表。 该列表维护用户 ID 和

相关资讯