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