如何实现消息推送功能

author author     2023-04-19     508

关键词:

消息推送(Push)就是通过服务器把内容主动发送到客户端的过程。运营人员通过自己的产品或第三方工具对用户移动设备进行主动消息推送。完成推送后,消息通知会展示在移动设备的锁定屏幕及通知栏上,用户点击通知即可去往相应页面。


现在流行的消息推送实现方式,主要为长链接方式实现。其原理是客户端主动和服务器建立TCP长链接,长链接建立之后,客户端定期向服务器发送心跳包用于保持链接,当有消息要发送的时候,服务器可以直接通过这个已经建立好的长链接,将消息发送到客户端。


个推作为国内移动推送领域的早期进入者,于2010年推出个推消息推送SDK产品,十余年来持续为移动开发者提供稳定、高效、智能的消息推送服务,成功服务了人民日报、新华社、CCTV、新浪微博等在内的数十万APP客户。个推消息推送,也是运用长链接的方式实现消息推送的,其长链接稳定性高、存活好,消息送达率高。开发者通过集成个推消息推送SDK,即可简单、快捷地实现Android和iOS平台的消息推送功能,有效提高产品活跃度、增加用户留存。


如果您对个推消息推送感兴趣,欢迎前往个推开发者中心免费注册体验。

个推的合作客户

参考技术A 在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的
和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。

在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。

Android Cloud to Device Messaging
(C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用

程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些
消息。

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

1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;

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

有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。

即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:

1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。

2)SMS:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的

应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现,可以
参考如下链接:https://labs.ericsson.com/apis/mobile-java-push/。

3)持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保

持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允
许在低内存情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。

前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk以及GoogleVoice都可以实现实时更新的。

Ø 采用MQTT协议实现Android推送

MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。

我们可以从这里下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现。

架构如下所示:

wmqtt.jar 是IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。

Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。

SAM是一个针对MQTT写的PHP库。你可以从这个下载它.

send_mqtt.php是一个通过POST接收消息并且通过SAM将消息发送给RSMB的PHP脚本。

实例代码:

可以从GitHub上下载实例应用。运行该应用以后,通过手机浏览器访问http://tokudu.com/demo/android-push/,在第一个输入框输入设备ID,在第二个输入框输入想要发送的消息内容,按下“Send Push Message”按钮,你就应该可以看到手机上收到了通知了。你也可以从这个GitHub地址上下载android-push源代码,它包含了send_mqtt.php脚本。

Ø 采用XMPP协议实现Android推送

这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。

XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。

androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下:

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协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。
采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。本回答被提问者采纳
参考技术B ?可以用第三方软件极光推送来实现。对于定制化需求较强的,或者想拥有自己推送平台的开发者,极光提供全功能的私有云方案。
极光推送快速开始步骤:1、到极光推送官方网站注册开发者帐号;
2、登录进入管理控制台,创建应用程序,得到 Appkey(SDK 与服务器端通过 Appkey 互相识别);
3、在推送设置中给 Android 设置包名、给 iOS 上传证书、启用 WinPhone,根据你的需求进行选择;
4、下载 SDK 集成到 App 里。
客户端初始化 JPush 成功后,JPush 服务端会分配一个 Registration ID,作为此设备的标识(同一个手机不同 App 的 Registration ID 是不同的)。开发者可以通过指定具体的 Registration ID 来进行对单一设备的推送。

参考技术C 基于自身开发实力,后期的维护,投入的资金成本的考虑,大部分公司会选择接入消息推送服务商来简介高效的实现推送功能。
极光大数据旗下的产品——极光推送是较早投入这方面服务的公司,是使用极光推送,开发者可以轻松地通过极光发送各个移动平台的系统通知,还可以在控制台编辑多种富文本展示模板; 极光推送还提供自定义标签,客户端接到消息内容后根据自己的逻辑自由处理。
极光推送可快速集成SDK,简单易用的控制台和API;
极光推送提供用户自定义的标签和别名系统,以及极光自己根据数据分析出的分类目标;
极光推送支持10亿级的高并发访问,多点备份保证系统稳定;
极光推送有专业的技术支持团队,及时响应客户的需求和问题;
极光专注于为移动应用开发者提供稳定高效的消息推送、即时通讯、统计分析、社会化组件和短信等开发者服务。基于海量数据和洞察积累,极光已将业务拓展至大数据服务领域,包括精准营销(极光效果通)、金融风控、市场洞察以及商业地理服务(极光iZone)。极光将继续借助人工智能与机器学习为移动大数据赋能,致力于为社会和各行各业提高运营效率,优化决策制定。
参考技术D 最简单就是用喵提醒,当然要看你具体推送场景是什么。

技术分享|基于rtm实现的呼叫邀请如何添加推送功能?(代码片段)

RTM实时消息服务,解决了在线实时信令的传递,如何配合推送服务,去做离线通知功能一直困扰着开发者,本文从RTM的功能以及响应机制入手,教大家如何通过RTM配合第三方推送服务来完成离线消息通知。RTM... 查看详情

技术分享|基于rtm实现的呼叫邀请如何添加推送功能?(代码片段)

RTM实时消息服务,解决了在线实时信令的传递,如何配合推送服务,去做离线通知功能一直困扰着开发者,本文从RTM的功能以及响应机制入手,教大家如何通过RTM配合第三方推送服务来完成离线消息通知。RTM... 查看详情

使用极光推送实现分组发送和服务端集成

...Android推送、iOS推送的统一推送服务平台。下面讲解一下如何使用极光实现消息推送应用,并重点讲解一下如何实现向分组发送消息及推送服 查看详情

技术分享|基于rtm实现的呼叫邀请如何添加推送功能?(代码片段)

RTM主要功能点对点消息与频道消息:向单个或多个用户发送和接收文字、自定义格式等消息或信令类型。用户属性和频道属性:对用户属性和频道属性进行增删改查操作,可以实现用户标注、群公告等功能。频道人数和成员列表... 查看详情

基于ajax与msmq技术的消息推送功能实现

...。我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图:  先说说这个ajax长轮询,多长时间才算长呢?这个还真不好界定。这里是相对普通ajax请求来说的,通常处理一个请求也就是毫秒级别... 查看详情

android心跳包心跳连接如何实现android和服务器长连接呢?推送消息的原理

...须涉及client(客户端)和server(服务器),所以到底client如何和server实现实时连接通讯? 分析问题:这种功能实际上就是数据同步,同时要考虑手机本身、电量、网络流量等等限 查看详情

如何在发送时不显示推送消息的情况下运行该功能?

】如何在发送时不显示推送消息的情况下运行该功能?【英文标题】:Howtorunthefunctionwithoutshowingthepushmessagewhenitissent?【发布时间】:2019-11-0105:17:20【问题描述】:我有一个问题需要通过推送消息来解决。如果我向Firebase发送推送... 查看详情

快递企业如何完成运单订阅消息的推送(代码片段)

原文:快递企业如何完成运单订阅消息的推送  经常网购的朋友,会实时收到运单状态的提醒信息,这些提醒信息包括微信推送,短信推送,邮件推送,支付宝生活窗推送,QQ推送等,信息内容主要包括快件到哪里,签收等信息... 查看详情

推送服务器实现技术?

...将有一个服务器和移动设备客户端应用程序。我需要知道如何将消息从服​​务器推送到客户端。那是我的客户端应用程序被动地等待消息来自服务器。从服务器推送消息背后的技术是什么。客户端有Android、J2me、BB、iphone等形... 查看详情

我有7种实现web实时消息推送的方案,7种!

...好,我是小富~我有一个朋友~做了一个小破站,现在要实现一个站内信web消息推送的功能,对,就是下图这个小红点,一个很常用的功能。不过他还没想好用什么方式做,这里我帮他整理了一下几种方案,并简单做了实现。案... 查看详情

使用websocket实现消息推送

...Socket上联系客服功能在项目中很难避免,一般有下面三种实现方式: 使用http的get方式轮询接入第三方IM系统自己的IM系统 基于socket基于websocket第一种方式,最low的,实现简单,但是浪费用户流量;第二种方式,接入简单... 查看详情

使用websocket实现消息推送

...Socket上联系客服功能在项目中很难避免,一般有下面三种实现方式:使用http的get方式轮询接入第三方IM系统自己的IM系统基于socket基于websocket第一种方式,最low的,实现简单,但是浪费用户流量;第二种方式,接入简单,功能强... 查看详情

winform上如何实现服务器消息实时推送?

...端,也就是服务器推送消息时客户端弹出消息窗口。应该如何实现~?客户端指定一个本地固定且空闲端口,监听此端口,长短连接(TCP,udp)都可以,实时无非就是监听频率提高一点,相关知识请学习SOCKET编程,不是很难我自... 查看详情

技术分享|如何快速实现音视频在线通话

请问咱们支持像微信一样的音视频呼叫功能吗?请问呼叫邀请怎么实现?如果客户端离线了,怎么呼叫到客户?怎么添加呼叫铃声?以及接收铃声?经常能听到有用户问上述的问题,今天借此机会向大... 查看详情

实现推送通知服务器:如何检查传递设备令牌的消息是不是来自真实设备?

】实现推送通知服务器:如何检查传递设备令牌的消息是不是来自真实设备?【英文标题】:ImplementingaPushNotificationsserver:Howtocheckthatamessagepassingthedevicetokencamefromtherealdevice?实现推送通知服务器:如何检查传递设备令牌的消息是否... 查看详情

手机通知栏推送消息推送怎么实现的

...技术概念,是指从服务端实时发送信息到客户端。应用想实现消息推送功能必须使用第三方或者自己研发,第三方推送工具推荐使用极光推送,极光推送是经过考验的大规模App推送平台,每天推送消息量级为数百亿条。开发者集... 查看详情

php如何实现艾特@功能大概思路

...就是在全文匹配@么,但是不清楚@后面的昵称是几个字啊如何再去用户表里查询呢追答1.一般存@xxxx其他文本其他文本,注意xxxx后面有个空格,算是@某个用户的结束符吧。2.把xxxx当作用户去用户表里查找用户信息就行。匹配@xxxx... 查看详情

微信小程序怎么实现消息推送

微信小程序怎么实现消息推送需要用户在微信小程序中订阅。就是当用户在小程序内点击特定按钮后会弹出申请订阅弹窗,同意后小程序才会在后续任意时间给该用户推送服务通知。但是微信订阅消息有如下几个特点:1、选择... 查看详情