由于谷歌服务在国内不能用,Android 的推送真是一大痛点,但也推动了国内一批做第三方服务的厂商。第三方推送做的比较好的有极光、个推、百度、友盟,经过比较之后,最后选择了极光推送。其实这些第三方推送之间的差别并不太大,技术上都没问题,能不能收到推送,关键还是看前端进程是不是还活着,这也是影响推送成功率的关键。从我们App来看,Android的成功率一直不高,还不到iOS的五分之一。
前面说了,影响推送成功的关键是前端进程是否活着,App想要收到推送的话,就要一直在后台运行,还有一些流氓软件,为了长期在后台运行,充分利用Android系统的开放性,无所不用其极,这也是早期Android给人体验差的一个重要原因。后来Android系统加强了对后台进程的限制,尤其是国内的手机厂商,在对付国产软件方面,有很高的造诣,甚至有的手机厂商就只给微信开了特权,其他软件到后台几分钟就被杀掉或冻结了。这样用户体验是上来了,但是对于推送来说,真是雪上加霜。
还好,小米、华为等手机厂商也意识到了这个问题,纷纷推出了自家的推送服务。想从根本上解决Android的问题,还得依赖这些厂商呀!2017年10月16日,工信部也联合国内各大厂商和互联网公司,发起成立了统一推送联盟,致力于解决Android推送问题,统一推送标准,但估计看到成果还需要些时日,远水解不了近渴。于是最近抽时间,研究了华为、小米、OPPO、VIVO这几家国内主流厂商的服务。
通过对各家推送服务SDK的研究,将分别对每家的推送进行分析,最终给出整合意见。
华为:
感觉华为推送的文档比较少,可能跟他的功能太简单有关。首先需要解释下几个名词:Hms(华为移动服务),NC(通知中心)。通知栏推送:即常规的推送,消息抵达时由NC,或者是小米/VIVO/OPPO/等推送服务弹出通知栏。透传:可简单理解为格式自由定义,不弹起通知栏的推送,且透传一般情况下需要在APP处于前后台时才能收到。
注意,HMS除了支持推送,还支持华为账号登录,华为支付等功能,你可以根据需要自由对接,但因为我们研究的方向问题,这里只讲推送部分。其实在此之前,还有一个老版本的华为推送,但SDK升级后老推送就不再支持,文档也不见了,且新老推送是不兼容的,你只能二选一。
新的华为推送服务不支持IOS,非华为手机使用华为推送SDK则需要APP各自建立长链接。在非华为手机上首次点开APP后,SDK会引导用户下载华为HMS安装,体验比较差,所以不建议大家在非华为手机上使用该SDK,而且个人尝试了下,虽然下载安装了HMS,但未能在非华为手机成功收到token。
华为手机使用官方推送的好处是显而易见的,杀掉APP通知栏依然可以收到通知,所有APP共享推送通道,手机更省电,但如果想要使用透传功能,就需要手机处于前后台状态。另外即便是EMUI的手机,也不是接入了SDK就能接收推送了,文档中写到只有部分EMUI4.0和4.1的手机,以及5.0之后的手机才能收到NC服务,其次,删除token和通知栏消息开关的api 在EMUI5.1以上的手机上才能起到效果。最后FAQ中有讲到EMUI8.0目前有个系统底层关于通知栏的bug,请将工程buildVersion、targetVersion和compileVersion都改成26之前的版本。
那如何分辨手机是否支持华为推送呢,官方FAQ提供了几个方法,点开“在线帮助”-“常见问题说明”中,有具体的EMUI版本及HMS版本的识别方法,这里不再复述。
服务端API调用有流控限制,用户短时间内发送大量的消息会被流控,并返回HTTP 503状态码。默认3000条/秒,如需要调整,请联系华为客服。并且每次API调用携带的device_token_list最大为1000个推送量,如果你的推送是群发则不用理会这个限制。
查看文档时,请着重看“开发准备”,和“客户端开发指南”,两处的文档描述很详细。
集成SDK时还有一点需要注意,除了使用gradle集成SDK,还需要下载一个hms agent压缩包,这个压缩包其实就是一些华为的代码,可能官方觉得把所有功能都整合到SDK里太大了,就用这种方式希望大家按需解压,但个人感觉其实没什么必要。解压后的根目录中有readme文件,建议仔细阅读,如果你是windows,请点击bat文件,执行后根据提示按需选择即可,最终把提取出来的java文件放入工程目录里。
在完成开发者账号申请,创建APP,集成SDK,修改manifest等准备工作后,你就可以尝试推送一条消息给手机了。
其实接入推送SDK,我们开发人员关心的无非三件事,一是如何获取token/regid,二是通知消息怎么回调,三是推送格式怎么写。
&nbs