本文为原创,如需转载请标明出处,侵权必究。git
去年笔者写了一篇 《安卓推送这件小事》 ,如今回过头来再看,很多地方已有些过期,趁着春节,从新思考和整理下推送这件事,这篇文章的目标受众不只是对客户端推送实践感兴趣的工程师,还包括对推送的用户体验现状不满的用户。github
推送分推送需求和推送技术,推送技术由工程师实现,推送需求来自用户,这里的用户包括以下几个角色:微信
不一样角色对推送的需求不一样,或者说对推送的度量的容忍度不一样。主要有如下度量维度:架构
而咱们最该关心的是普通用户的需求,即推送的到达率和推送内容。若是不理清上面的需求分析,即便推送技术实现得再好,也没法在实际场景得到成功。做为工程师不能埋头作技术,任何一项业务背后都有它的核心需求。app
以上说明了作推送这个需求时的考虑问题的优先级,在不断的迭代过程当中,仍是须要把各方面都作到尽善尽美的。工具
在人力成本受限的状况下,客户端实现推送不可凭一己之力,整个推送的实现过程与其说是开发,不如说是项目管理。咱们来看看推送须要和哪些业务伙伴打交道:优化
那么笔者是如何来看这个问题的呢,首先须要进行一次项目管理的需求转换,上面几个业务伙伴的分类不便管理,须要作一次从新分类,具体以下:ui
上面分类后是否是逻辑清楚了不少呢,可是还不够,咱们只是进行了功能上的划分,在时序上还要想明白:指针
需求抽象到这里,那么实现也就水到渠成了。调试
如今不少工程师 UML 图都懒得画,虽然 UML 不等于架构能力,可是确实是提高抽象和架构能力的一个很好的工具。
图中的每个方法是对推送概念的一个抽象。
别忽视这些细节,关键时候可能会让你的整个推送用起来不爽。
在这里提到的 sdk 是推送实现的 aar 或者 jar 。
咱们的推送平台策略是服务端下发的,会根据下发的 vendor
来决定开启指定平台的推送,关闭其余平台的推送。但以前常常有用户经过系统工具看到后台跑了两个推送进程,这是怎么回事呢?原来,推送实现为了知足不被杀掉的需求,会尽量地让本身的推送进程活着,即便手动调用了 sdk 的 stop 方法也没用。
这个时候只能上大杀器了,咱们在 stop 方法以后延时几百毫秒调用 Process.killProcess()
方法。
你们知道 FCM 推送是要知足必定条件的,而且即便知足条件,也不必定能够收到推送,那么就须要对条件的判断有一个策略,这个策略还在迭代,等到稳定后再讲。
任何涉及到业务伙伴的事情,若是只关心技术文档或者代码,可能会事倍功半,由于代码是人写的,既然你引入了别人写的 sdk ,那么就要去创建一条沟通路径,包括以下方式:
相信我,当你真的发生问题的时候,直接联系相关人员,远比本身调试代码来得容易。
说到这里,是否是理解了笔者以前说的,推送这件事,本质是项目管理而不只仅是开发呢,其实其余事情也同样,明白了根源在哪里,解决问题的思路就会很不一样,不会纠结于具体的技术细节,而是先确保大方向的正确性。
上面这些只是不断迭代实践得来的经验,推送这件事任重而道远,去年如火如荼的**“安卓统一推送联盟”**,正是为了解决这一问题而来,但因为历史缘由和各方利益的博弈,到最终解决问题仍是有很多路要走。
可能用户最不满意的仍是前面提到的:该推的不推,不应推的瞎推。
这也是笔者写这篇文章的目的之一,经过背后的这些思考告诉用户,不是看不见大家的不满,咱们在努力让推送这件事变得美好,而大家如今立刻能够作的,就是去本身关注的主题下,明确本身的推送需求,把不须要的所有关掉就好,其余事情由咱们来解决。