什么是端外推送?

通常大厂的App都会区分端内推送和端外推送(端指的是客户端),具体说来:

  1. 当App在前台运行的时候,这时的推送称为端内推送。端内推送一般是走App自己实现的一套推送系统:推送服务器是自己的,客户端维护一条长连接连到自己的推送服务器,不依赖任何第三方的推送系统。
  2. 当App从前台退到后台,在短时间内App未被杀死前,App自己的长连接仍然有效。这时的推送可以仍然走App自己的推送系统。所谓的“Android进程保活”,就是为了尽量延长这段在后台存活的时间。
  3. 当App在后台运行足够长的时间后,App进程由于被清理或者其它原因,App自己的长连接断开。这时的推送就称为端外推送了,只能走某个第三方推送平台了。

为什么要使用端外推送?

  1. 假如App的推送进程能够一直存活不被清理,那么端内推送就能够很好的满足各方面的需求,但是由于android系统本身对于这种行为是拒绝的,所以网上进程保活的黑科技都是不稳定的;
  2. 如果不能保证App进程一直存活,那么退而求其次,当App进程被杀死的时候能够及时有效的被重新唤醒,恰好端外推送能满足这一需求
  3. 目前通过端外推送(第三方推送)实现拉活的方式已经是业界公认的处理方式(手Q和微信等白名单另说),因此对于某些手机不能正常接到推送,可能是手机管家之类的自启动开关或者关联开关关闭导致的;

怎么使用端外推送?

1.首先要选择合适的第三方端外推送平台,根据国内Top500Android应用分析报告(2016-07-11):

2.第三方推送平台的工作流程。一次典型的消息推送过程如下图所示:

大致的流程可以描述如下:

a、开发者首先将消息推送指令发送给第三方推送提供商,告知推送服务商本次推送任务要发送的内容和目标对象;

b、推送服务商收到推送指令后,会对推送的设备集合做有效性检查,同时选择当时长连通道在线的设备进行消息下发;

c、消息会首先送达设备,送达设备后,会根据 App 包名( Android 平台以包名作为 App 的唯一标识)路由给 App ,路由到 App 之后,终端用户就可以接收到通知消息了,由此消息推送的整个过程就算完成;

3.通常第三方推送平台都支持两种推送消息类型:通知栏消息和透传消息。

a、通知栏消息,在被送达用户的设备后,直接以系统通知的形式展示给用户。它不会继续被传递到App(如上图3-2中的流程1)。如果App有自己的端内推送系统,那么这种通知栏推送消息就更合适一些。当端内推送的长连接失效时,我们通过通知栏消息把提醒展示给用户,由用户唤起我们的App,然后真正的消息数据再经由端内推送达到客户端。

b、透传消息,在被送达用户的设备后,还会继续路由到App,通过回调App的某个BroadcastReceiver的形式将消息传递到App内部,然后由App决定如何处理和显示这个消息(如上图3-2中的流程1-2)。透传消息在整个消息传递过程中比通知栏消息多了一步,因此就增加一些被系统限制的概率。所以说,通知栏消息比透传消息应该能提供更好的送达率。

4.第三方推送的一些限制。

a、个推等到一定的消息量级会收费;

b、小米推送SDK提供同步方法却做异步的事,一个命令之后才能进行下一个命令操作;

c、华为推送对透传的支持API一次只能发送1000个设备;

d、由于第三方推送都是共用一个推送通道,所以存在推送通道堵塞的可能。这样就导致后面排队的app收不到端外推送通知;

5.手机厂商的市场份额的变化,以及推送平台市场的变化,

Android推送也是一个不断处于变化中的话题。GitHub上有一个讨论Android推送的帖子(由Trinea大神发起),这个帖子从2015年5月份开始讨论至今,仍然没有人给出一个完美的解决方案。所以我们开发者需要实现一个拓展性强的推送架构,这样就能及时切换到某个第三方的推送渠道。另外,由于国内的各大手机厂商对于安卓系统做了各种不同的定制,增加了很多安全性的限制,导致推送成了一个很复杂的问题。而这个市场中又没有哪一家完美解决了所有手机设备的推送送达的问题。同时,微信由于其先发优势和规模优势,进入了各大厂商受保护的白名单,进一步拉开了与其他App在推送送达率上的距离。

推送工作流程图