Android系统由google提供的推送的服务在国内并不能很好的运作,因此不能像iOS能提供统一管理的推送服务。Android端推送目前常用的都是第三方推送服务,也可以自己搭建推送服务器来实现, 为了节约开发成本,目前主流的提供第三方推送服务的有:极光推送、个推、友盟、小米推送、百度推送等。
Android端推送分为通知,透传两种,通知是有通知栏显示的,透传由用户自定义处理,可以做静默,也可以自定义通知栏显示,个性化程度较高,点击的逻辑处理也比较方便。
iOS端推送的话,应用程序在前台的时候,推送通知有程序处理,当应用程序在后台的时候,由系统统一处理推送消息,此时可以配置静默推送,来处理通知栏的显示与否,这一点和Android一样,但是由于是系统统一处理,所以到达率有保证,这一点android端就比较麻烦了。
本文将整合小米、个推、极光推送,从而提高app推送的到达率。实践发现,由于Android系统的差异性,在Android单独使用某一个推送并不能很好的完成推送服务。原因就是因为某些厂商的android系统安全性比较高,当完全杀死进程后,将无法收到推送服务(例如小米、魅族)。需要用户手动操作的详细列表如下:(来源:极光推送android常见问题:http://docs.jiguang.cn/jpush/client/Android/android_faq/)
**由于第三方 ROM 的管理软件需要用户手动操作**
小米【MIUI】
自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启
通知栏设置:应用默认都是显示通知栏通知,如果关闭,则收到通知也不会提示
网络助手:可以手动禁止已安装的第三方程序访问2G/3G和WIFI的网络和设置以后新安装程序是否允许访问2G/3G和WIFI的网络
MIUI 7 神隐模式: 允许应用进行自定义配置模式,应用在后台保持联网可用,否则应用进入后台时,应用无法正常接收消息。【设置】下电量和性能中【神隐模式】
华为【Emotion】
自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程不会开启,只能手动开启应用
后台应用保护:需要手动把应用加到此列表,否则设备进入睡眠后会自动杀掉应用进程,只有手动开启应用才能恢复运行
通知管理:应用状态有三种:提示、允许、禁止。禁止应用则通知栏不会有任何提醒
魅族【Flyme】
自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启
通知栏推送:关闭应用通知则收到消息不会有任何展示
省电管理: 安全中心里设置省电模式,在【待机耗电管理】中允许应用待机时,保持允许,否则手机休眠或者应用闲置一段时间,无法正常接收消息。
VIVO【Funtouch OS】
内存一键清理:需要将应用加入【白名单】列表,否则系统自带的“一键加速”,会杀掉进程
自启动管理:需要将应用加入“i管家”中的【自启动管理】列表,否则重启手机后进程不会自启。但强制手动杀进程,即使加了这个列表中,后续进程也无法自启动。
OPPO【ColorOS】
冻结应用管理:需要将应用加入纯净后台,否则锁屏状态下无法及时收到消息
自启动管理:将应用加入【自启动管理】列表的同时,还需要到设置-应用程序-正在运行里锁定应用进程,否则杀进程或者开机后进程不会开启,只能手动开启应用
三星
内存一键优化:需要将应用加入【白名单】列表,否则系统内存优化后,会杀掉应用进程
为什么需要自启动权限:因为当手机进程被杀死后,所有推送服务被关闭,同时以上厂商的手机系统禁止自动启动。第三方推送服务都会在自己的进程被杀死后企图自动打开,进而可以实现当APP被完全关闭后(关进程)仍可以接收推送。但当自启动没有打开(以上手机安装时自启动权限默认是关闭的),推送是无法到达用户的。若推送的消息仍然没有超过后台设置的保留时长(一般保留24小时),当在次打开app时将会收到延时推送。
为了解决自启动的问题,部分厂商提供了守护进程的服务。
什么是守护进程:既然我不能自启动,那第三方推送就提供一个方式,当别的APP也使用了同样的推送服务时,可以通过别的app将自己的app推送唤醒。即时自己的app被进程杀死了,同样可以收到后台推送。这时候作为开发者,就必须考虑哪个推送平台提供推送服务并且占有一定的市场比例。然而在Android推送市场上,并没有一家独大的局面。因此选用某一种推送并不能确保大部分用户收到推送。
为什么选择整合小米、个推、jpush:
通过查阅资料:友盟、百度推送使用并不广泛。自己在实践过程中,通过查看后台进程也发现app一般使用个推、jpush的较多。
小米的优势:从自启动列表中可以看出小米是默认禁止自启动的,并且第三方推送想通过守护进程来接收推送,实践证明:
1:个推推送:个推在版本SDK 2.6.1.0上,在小米手机上守护进程能启动,但是启动后依然收不到推送。
2:极光推送:极光推送从1.8.0以后也提供了守护进程(在极光文档上称为拉取进程),在小米手机上能启动,并且推送有效。然而1.8.0更新是在2015-07-27才出来,在2015年11月通过查看后台进程会发现使用极光推送的大概只有百分之十的app开启了守护进程。
综合考虑以上因素,当自身的app小米手机用户占到所有手机用户一定比例时,就必须使用小米推送来确保小米用户能够收到推送。小米推送可以确保不管app是否被进程杀死,都能及时收到推送服务。
个推优势:具有一定的用户群体并且提供守护进程,占用内存少。
极光优势:1.8.0后提供守护进程,这里有一个时序的优势:就是当后台先推送消息,自身app并没有打开,打开其他有极光推送守护进程的app,也会收到推送。而个推的情况是:当后台先推送消息,自身app并没有打开,打开其他个推推送守护进程的app,收不到推送。当先打开其他守护进程的推送app,后台在进行推送消息,则极光、个推都可以收到自身app的推送消息。守护进程的对比表格如下:(测试手机是小米note和魅蓝)
守护进程 先推送后打开守护app 先打开守护app后推送 推送服务名称 守护名称
jpush 1.8.0提供 收到 收到 PushService DaemonService(配置才守护)
个推 有 收不到 收到 NotificationCenter (默认守护)
小米 没有 没有守护进程 没有守护进程 XMpushService 无
查看守护进程:
小米手机:设置-其他应用管理-运行中
魅族手机:设置-应用管理-正在运行
需要测试守护进程可下载宝贝玩啥app,宝贝玩啥已经整合jpush、个推的守护进程。
由以上分析可以看出,同时整合小米、个推、jpush三个推送服务,目的是确保小米手机用户是在联网的情况下一定收的到推送,同时希望使用个推和jpush提高app在进程杀死的情况下提高收到推送的成功率。
整合方案:
整合了三个第三方推送,目的就是消息推送只能显示一条,因为后台无法判断哪个推送可以收到的消息,因而后台会把一条消息同时使用小米、个推、jpsh进行推送。所以android端要控制的就是收到三条推送,如何只显示一条,不能重复显示。
解决思路:每个第三方推送都提供推送通知和透传的方式,推送通知就是一旦android端接收到推送,就会显示出来,而透传的方式是由android端来决定收到透传消息之后的操作,因此在第三方推送初始化前,先判断是否小米手机,如果是小米手机,初始化小米推送,个推、极光不初始化,因为对于小米手机,小米推送可以确保能收到。后台选择的是推送通知的方式,通知栏的显示由后台来决定;如果不是小米手机,选择初始化极光推送和个推,提高推送的成功率。此时极光推送和个推无法确保谁的推送谁先到达,因此选择透传的方式,通过本地显示通知。当极光推送收到通知后,记录该消息的id并且显示出来,当个推收到同样id的消息时,不予显示。