Android消息推送的思考

消息推送是移动APP运营中的关键环节,然而对于面向国内的Android开发者,建设这个基础能力一直是个痛点加难点。虽然Google有推出GCM服务,但是由于Google服务在国内不稳定,加上国内各大厂商定制了ROM,阉割了Google服务,所以GCM在国内基本作废。各大厂商纷纷推出自家推送服务,小米、华为、Oppo、Vivo、魅族等都有,各种第三方推送服务也应运而生。各大厂商自家的推送服务进程在自己定制过的Android系统中,享有较高的优先级,因此稳定性不在话下。到了别的牌子的手机上就要想办法让推送服务的后台进程保活了。各种三方推送服务想尽一切办法让推送服务进程在后台包活,由此衍生了很多“黑科技”,遭殃的却是Android用户,造成了手机资源占用高,手机卡、费电等问题。

对于Android推送的方案,我的观点是宁愿降低消息到达率,也不耍流氓。在不用尽各种办法来保活后台进程的基础上最大限度的提高消息到达率。根据市场占有率分析,华为、小米、Oppo、Vivo占据大头,而这几家都有自己系统级的推送服务,所以接入他们的服务即可。这对海外用户,采用GCM的方案。站在运营人员的角度,希望抹平平台的差异,配置一份消息,就能够触到iOS和Android用户。考虑下来,需要自己起一个后端服务平台对接这些推送渠道(包括Apple的APNS)。这些渠道外的手机用户在静默状态近乎放弃,只能等到应用被打开之后,与服务器建立了长连接再推送。推送场景分为用户相关和用户无关。用户无关的全量推送可以按照服务器登记的所有deviceId进行下发。用户相关的推送则要根据服务器登记的最新的deviceId进行下发。假设用户1在A、B两台设备进行了登录,最近的一次登录是B设备,那么对于用户1来说用户相关的推送只要针对B设备进行下发。下发之前还要检查当前用户是否在线,当前在线则走应用内的长连接,不在线则判断是否拥有自主推送渠道,若有则发给对应的渠道下发消息,若无则存储这条消息等到下次用户在线走应用内的长连接下发。这种做法既能保证应用不占用过多的系统资源,还能保证推送服务的稳定性。不足之处是,没有自主推送渠道也没有GCM服务的手机在离线状态下,推送无法送达,不过这部分的市场占有率相对较低。

一个好消息是,工信部在2017年联合国内各大Android厂商和互联网企业成立了安卓统一推送联盟,想要解决这种乱象。时间已经到了2019年,期待尽快有个结果。让Android开发者把心力专注在开发产品本身,这才是提高用户粘性的根本。