目前,在实际开发中,后台向移动端推送消息的业务需求一直存在,而市场上关于消息推送的技术解决方案也很多。如何根据实际业务需求,对选择适合的消息推送方案,也是开发者在日常工作中无法避免地遇到的问题.
在工作中,正好业务中对消息推送的实时性较高,初期我们选择免费版极光推送方案(第三方推送技术),后期当业务正式上线的时候,遇到一些问题,主要是客户反馈及时性和准确率不高等问题,然后我在经过调研和分析,得出一些可供参考解决的方案。在调研过程中,学习得一些知识,因此写下这篇文章,供其他具有相同困扰的人参考。
基础知识
常见的国内第三方推送技术
- 小米推送(MiPush)
- 华为推送(华为Push)
- 友盟推送(U-Push)
- 个推
- 极光推送
- 阿里云移动推送(Alibaba Cloud Channel Service)
- 腾讯信鸽推送
- 百度云推送
本地推送 vs 远程推送
本地推送:不需要连接网络,开发人员在合适情况下在APP内发送通知
远程推送:必须连接网络,由服务端发送通知到移动端
本文主要讨论的是远程推送的技术解决方案。其中,IOS开发中的远程推送方案为APNs 苹果推送通知服务(Apple Push Notification services)。所有苹果设备在联网状态下都会与苹果服务器建立长连接,连接是双向的,苹果设备可以向苹果服务器发送请求,苹果服务器也可以向苹果设备发送请求。
普通推送 vs 透传推送
以下截取华为推送文档中关于普通推送和透传的解释
透传消息是华为Push将消息送达手机后不做呈现,直接转给开发者的应用,由应用本身去解析消息和呈现内容。通知栏消息是华为Push将消息送达手机后,会在通知栏显示一条消息,点击后触发指定动作,应用不需要去解析消息和控制呈现,减少了应用的开发工作量。
小米推送文档中也有类似的解释。我的理解是透传是对用户透明的,消息从起点到目的方的传输,需要应用程序去判断如何接受之后如何去处理。而根据描述,我所在的业务属于通知栏消息,即只需要APP弹出服务器推送过的消息在通知栏,用户点击通知栏的消息,点击跳转到对应操作的页面。
华为和小米推送对通知栏消息走系统推送通道,即使应用被手机系统杀死,用户也能收到消息。但前提是:华为推送必须要求手机的系统为EMUI系统,小米推送必须要求手机的系统为MIUI系统。即解决方案不具有通用性,因为很难保证用户的手机一定是华为手机或者是小米手机。
原因分析
当前手机安卓操作系统众多,厂商会在原生Android系统基础之上,进行修改和定制,因此百花齐放。不同操作系统限制不同,会根据自身限制和策略,可能会当你熄屏或者不操作应用的时候,杀死进程,来保证手机电量或性能等。第三方消息推送推送的原理,其实是应用与第三方服务器保存长连接,然后进行消息的发送。如果应用被进程杀死,第三方服务器会将发送该应用的消息保存为离线消息,一般离线消息保留的条数都有限制。当应用再次启动与第三方推送服务器建立连接的时候,第三方服务器会发送将保存的离线手机发送到移动端。这也是为什么我们在手机使用某些应用APP的时候,一打开突然通知栏弹出很多消息和广告。
相对Android开发,IOS开发就比较规范,可以利用APNs走系统推送,即使进程被杀死也能收到消息。
解决方案
我们选用的极光推送,经过测试华为手机,发现当手机熄屏和将应用放置后台时,应用就收不到推送的消息。如何提高送达率,即一定时间内不使用应用或者熄屏的时候,应用也能收到消息。我认为主要可以从两个大方面解决:
- 换第三方案消息推送机制,或者集成多个消息推送技术;
- 应用保活
- 程序优化,保证应用程序不被系统杀死;
- 手机设置保存应用;
- 申请加入系统白名单。
一个是从消息推送方案的选取上优化,集成多种消息推送技术,这样针对用户操作系统,选取适合的推送方式。而且,采用某些相同的消息推送技术的应用是可以实现相互拉启的。例如应用A和应用B都采用消息推送机制C,那么应用A被用户唤醒,即使应用B在后台运行,也可以被拉起收到消息,当然这是推送技术付费功能。有的第三方推送方案付费版甚至已经集成了多种消息推送机制,这样就不需要开发者再去重新集成,而且付费版一定程度也会提高送到率等,例如极光推送。这也是目前常选择的方案。
一个从应用本身优化程序,可以让应用程序不被系统杀死,尽量保活更久,如何实现可参考《论Android应用进程长存的可行性》《Android进程保活详解:一篇文章解决你的所有疑问》文章。但目前很多操作系统限制很多,其实很难做到应用程序不被杀死,即使优化之后,可能并不适合所有机型,所以其实很难优化。也可以通过手机设置,让信任的APP应用尽量不被杀死,例如华为手机设置,具体方式可见华为手机如何打开软件的锁屏后台运行及消息推送? - 李木子的回答 - 知乎。这种方式我也测试过,似乎没有任何改善。最后,可申请加入某些手机厂商的白名单,使得应用进程不会被杀死,个人认为这种对小公司开发的应用的可操作性也不强。这种方式通常需要提供厂商应用和申请等,需要等到厂商的审批。例如我在华为手机论坛上找到申请加入华为手机的白名单的申请表,见应用如何加入华为官方系统白名单。
参考资料
- 极光对熄屏收不到消息的解释,https://community.jiguang.cn/t/topic/5145/3
- 知乎关于华为手机推送机制的讨论,https://www.zhihu.com/question/56669267
- Android 推送集成华为,小米,友盟测试,http://www.cnblogs.com/liyiran/p/6558652.html
- 知乎:iOS 和 Android 的后台推送原理各是什么?有什么区别?https://www.zhihu.com/question/20667886
- 目前推送存在的一些问题,https://www.jianshu.com/p/017096be88da
- 目前看到总结最全面的文章,https://juejin.im/post/57a19c012e958a0066715d0c
- 网友给出解决方案建议,https://blog.csdn.net/yueaini10000/article/details/81331444