技术标签: 转载
转载自:https://zhuanlan.zhihu.com/p/22461795
说Android端外推送比较烦,实际有两层意思:首先是说实现上比较麻烦,至今业界也没有找到一种完美的解决方案,Android程序员通常需要同时集成多家推送平台(如果有自己的端内推送,还要考虑与端内推送的配合);其次是说Android推送的市场现状比较混乱,无论选择哪一家,都让人纠结万分,难免心情烦躁。无论是你花费了多少功夫,做了多少优化,仍然可能存在推送不到或推送延迟的情况。
网上已经有很多关于Android推送的讨论,但很少有站在App开发者(特别是开发App的创业团队)的角度来进行介绍的文章。本文的目的,就是站在一个App开发团队的角度,集中讨论两方面的问题:
通常大厂的App都会区分端内推送和端外推送(端指的是客户端),具体说来:
从这个过程来看,大厂的App的推送策略可以概括为:优先使用自己的推送,实在不行再走第三方推送平台。为什么这样呢?因为自己的推送系统更快、更有保障:
我们虽然算不上大厂,但我们维护的微爱App也是有自己独立的端内推送的,而端外采用另外几家推送平台,后面我们再详细讲。
那为什么本文只讨论端外推送呢?因为讨论端内推送和讨论端外推送是完全不同的两个话题。讨论端外推送,我们主要是在讨论怎么对各家的推送平台进行选择,以及集成各家SDK的时候我们应该重点注意哪些问题。这通常是很多初创团队更需要的。
而讨论端内推送,主要应该讨论一个推送系统的具体实现,这是一个比较复杂的问题,并不是一篇文章就能讨论清楚的。在这里,我们只是浮光掠影地浏览一下这个话题可能涉及到的内容,但不做展开讨论:
综上,本文要讨论的重点是端外推送。
端外推送我们必须依赖第三方的推送平台了。
这个情况其实本来跟iOS上类似。在端内推送系统的长连接失效的时候,我们就只能通过其它的推送平台来完成。在iOS上我们只用使用APNs就行了。
而在Android上,跟APNS对应的服务是谷歌的GCM (Google Cloud Messaging),但很可惜它在国内的可用性不高(主要原因是手机厂商对Android系统的定制化,可能会将GCM服务裁减掉,以及国内运营商的一些限制)。如果我们做的是一个海外的应用,那么端外推送基本只用考虑GCM就可以了。
那国内的Android推送平台有哪些可以选择呢?
根据我个人了解到的信息,我列出了下面这些(排名不分先后):
上面提到的各推送平台大体可以分为三大类:
要对这些推送平台进行选择,我们首先要知道各类推送平台的优势分别是什么。
首先,对于手机厂商的推送,他们的推送服务在他们自己生产的手机上属于系统级别的服务,理论上来说,手机系统对他们自家的推送限制最小。
比如,在小米手机上,不在系统自启动名单里的App,在手机重启后,App声明的后台Service并不会自动运行。但是,小米推送作为手机系统级服务,仍然是可以收到推送的。
同样,华为推送的技术团队也对外宣称(原话):
华为Push,在华为手机上是系统级别的服务,稳定性等各方面肯定都会好些。
但是,即使是系统级别的推送服务,也不是百分百保证消息送达。这里比较奇葩的是华为推送,下面是他们技术支持给出的描述(原话):
华为手机上:Emui3.0上,Push广播有很大概率被限制,如: Mate7 3.0版本,荣耀6plus,P7 3.0版本,4X, 4A等。Emui3.1上,Push广播基本不被限制,但个别型号机型存在问题,如:荣耀5x等。Emui4.0及以上,Push广播有较高概率被限制,不被限制的机型如:荣耀畅玩4C,荣耀畅玩4X,Mate S,P8 MAX等。如广播被限制,需要将应用设为开机启动项。所以对于及时性或到达率要求非常高的应用,我们建议应用要考虑替代方案。后续Push版本,华为将采用新的设计方案,解决被限制的问题,但发布计划待定。
另外,至于限制的问题,其实华为sdk还是能接收到推送消息的,当将消息通过广播发送给应用是,如果手机管家查到该应用处于stop状态,那么会拦截该广播的。
看完之后的感觉:还真他妈复杂!
总之,华为手机上的推送,华为推送自己也不太完全能搞得定的。但是,我们考虑再三,似乎也没有更好的选择了。
再说第二类:专业的第三方推送。他们的优势看什么呢?看他们“保活”和“互拉”的能力。举个例子,假设你接入了友盟,而恰好今日头条也接入了友盟。有一天你的App被杀死了,但是今日头条的装机量估计比你的要大啊,这时用户启动了今日头条,那么推送系统也就会通过共享的推送通道顺便把你推送消息送达到手机上,然后还可能把你的进程也唤醒(被“保活”了)。
这么说来,选第三方推送平台,这个推送平台的规模效应就很重要了。那如何得知他们的规模和市场份额呢?最好的办法是问内部的朋友。否则,其实也没什么好的办法,每家肯定对外都说自己最好啊。有一个不太精准的方法,就是看他们的合作客户里有哪些大的app,到他们官网上的合作案例里去看。这个信息总不能乱写把。
而对于BAT大厂的推送呢?看起来并没有什么优势。各家的“全家桶”采用的“保活”阵营和推送通道,跟他们开放出来的是两码事。比如,你不要以为用了腾讯信鸽推送,就能占上微信的光。
这里需要单独提一下的是阿里云的移动推送。在他们官网上提到,手机淘宝就是用了阿里云的这个推送。不过仔细研究一下会发现,手机淘宝也在同时使用其它的第三方推送平台啊(比如友盟推送)。两个平台到底谁借谁的力更多呢?不得而知啊。
综合上面的分析,我们在微爱的Android客户端里使用的推送方案基本如下所述:
注意:小米推送在非小米手机上当然也能工作,只不过就不是系统级别的服务了,受的限制就多一点。同理,华为手机也一样。我们之所以这样选择,是为了让不同的推送运行在各自擅长的环境里。
基本的架构图如下:
本来呢,对于推送平台的选择问题,到这里就应该结束了。但是,最近发生了一件事,让我们觉得被X-Push这家坑了一把,这让我们突然意识到了一个选择陷阱。现在把它分享出来,好让大家选择的时候一定要擦亮眼睛。
事情大致经过是这样的:我们开始集成X-Push这家推送的时候,使用的是免费版服务。但是,我们用了一段时间之后,他们的销售找了过来。宣称他们SDK里的“看护功能”,是付费功能,如果不付费,技术那边就会通过一些操作关闭这一功能。这里他们提到的“看护功能”,大概就是本文前面提到的“保活”和“互拉”的能力。
这个事情的关键点在于什么呢?
如果把这件事的全部细节写出来,恐怕还需要额外的5000字。由于本文的主要目的还是分享技术选型的经验,所以这里点到为止,能把事情的大致经过说清楚就好了。等这件事尘埃落定以后,我们也许还有机会再重新拿出来讲一讲这个故事。
但是,这里你要记住的是,在你选择一家推送平台之前,一定要找人问清楚对方收费的模式,有没有隐性的消费陷阱。记住:没有人主动会告诉你哟。
大家也别问这家X-Push到底是哪家了,大家自己去体会。这里能起到提醒的作用就够了。
对于小的创业团队来说,自己实现端内的长连接推送系统,成本还是不小的。
其实呢,各个第三方推送平台也是可以在端内使用的。而且,他们一般也对iOS的APNs推送也有封装。所以,在资源紧缺的情况下,小团队在初期也可以选择某家第三方推送平台做自己全部的推送服务,能快速地同时支持Android和iOS两个平台推送。等后边人手充裕了,再考虑进行优化,或加入新的推送渠道。
具体怎样选择,还在于你自己权衡。
通常第三方推送平台都支持两种推送消息类型:通知栏消息和透传消息。
通知栏消息,在被送达用户的设备后,直接以系统通知的形式展示给用户。它不会继续被传递到App。
而透传消息,在被送达用户的设备后,还会继续路由到App,通过回调App的某个BroadcastReceiver的形式将消息传递到App内部。然后由App决定如何处理和显示这个消息。
这两类消息在送达率的保证上有所不同,当然在提供的编程能力上也非常不同。
透传消息在整个消息传递过程中比通知栏消息多了一步,因此就增加一些被系统限制的概率。所以说,通知栏消息比透传消息应该能提供更好的送达率。
比如,小米推送的文档中就这样描述:
在一些 Android 系统(如 MIUI)中,受到系统自启动管理设置的限制,应用不能在后台自启动。在这类系统中,如果在发送消息的时候对应的应用没有被启动,透传类消息将不能顺利送达。因此,对于对送达率要求很高的消息,建议尽量采用通知栏提醒的方式推送消息
如果App有自己的端内推送系统,那么这种通知栏推送消息就更合适一些。当端内推送的长连接失效时,我们通过通知栏消息把提醒展示给用户,由用户唤起我们的App,然后真正的消息数据再经由端内推送达到客户端。
实际上,我们就是采用通知栏消息这种推送方式的。
而透传消息,提供了对消息数据的更灵活的操纵能力。App如果仅仅通过通知栏消息,是无法接触到消息数据本身的。
所以,如果App没有自己的端内推送系统,而是采用第三方推送作为端内推送通道,那么就只能使用透传消息。
另外一个例子,如果App想自定义通知提醒的样式,以及提示声音,恐怕也只能通过透传消息来自己实现。通知栏消息通常提供不了那么灵活的配置。
这里有一点需要说明的是,当透传消息送达设备后,如果在试图路由到App内部的时候,发现App进程不在,那么理想情况下它应该“拉起”App进程。所以,照此推测,如果前面提到的那家X-Push关闭了“看护功能”的话,那么透传消息会受到多大的影响呢?结果可想而知。另外,X-Push那家的销售说了,关闭“看护功能”,对通知栏消息的“消息触达效果”也是有影响的。无语......
我们使用第三方推送平台,最关键的地方在于前两个步骤:
这里的推送token,在不同的推送平台上的叫法不太一样,比如在小米推送中被称为reg id,在华为推送中被称为token,在个推中被称为cid,在友盟推送被称为Device Token。总之,它是推送平台对设备的唯一标识。我们这里统称它为“推送token”是为了方便讨论。
App的客户端拿到它之后,必须要同步到自己的服务器,并与自己的用户ID建立起对应关系。这样当我们想推送消息给我们的某个用户的时候,我们才能查到对应的推送token。
前面说的初始化和推送token同步这两个步骤,看起来很简单,只是调用SDK的现成接口,再把它发送给服务器而已。但是,好的代码不仅能在正常情况下工作,还应该充分考虑失败情况。有什么样的失败情况需要我们考虑呢?我们以小米推送为例来分析一下:
上述第一种初始化错误,理应由推送SDK来处理。如果失败,它应该会有重试机制,直到成功获取了推送token,它再重新调用App把推送token传过来。比如,小米推送平台也是这么宣称的,初始化可能出现的错误,App开发者不用考虑。如果你充分信任推送平台,那么这个错误其实是可以不用去考虑的;否则,你可以在App里增加某些机会来检测初始化是否已经成功(可以通过检测是否已经拿到推送token来确定),然后在恰当的时机重新调用初始化代码。当然,在做这个事情之前,你最好与推送平台沟通清楚,确保重复调用初始化代码不会产生什么副作用。
上述第二种错误,就必须靠App开发者自己处理了。这里我们实际上需要在App客户端和服务器之间抽象出一条强的通信通道,我们把同步推送token的请求放进去,这条通信通道能够在失败发生的时候自动重试。
这里的代码写得是不是足够健壮(robust),不同level的程序员就高下立判了。
我们可以说,恰当而全面地处理失败情况才能真正体现工程师的意义,这也是工程和理论研究的不同点之一。
推送做得好不好,以及我们选择推送平台选的好不好,关键在于送达率高不高。送达率这个概念,一直是个很混乱的概念,有些平台会宣称送达率能达到98%以上,而又有一些人说行业平均水平也就60%左右。
为什么说法如此迥异呢?是因为大家在说的其实不是一个送达率。
友盟的消息推送业务线负责人陈漠沙曾专门写过一篇文章,来澄清送达率概念的一些误解,文章写得相当好,建议做推送业务的同学一定要读一下:
关键是要分清此文中定义的“在线送达率”和“通用送达率”。
“在线送达率”,各个推送平台优化到最后,可能都差不多。估计都能达到98%以上。
而“通用送达率”才是真真正正把消息推送到你的App的最终的送达率,这个也才是用户最终能感受到的送达率。App开发者需要真正关注的也是这个。
“通用送达率”大概来讲,是最终到达App的消息数与开始发出的消息数的比率(在一定时间内监测)。跟这个比率直接有关的因素是两个:
所以,这么说起来,不同的App由于业务不同,推送调用方式也不同,那么他们的通用送达率就没有实质的可比性。
那假如我们推送做了某个优化,或者某天换了一个更好的第三方推送平台,我们怎么知道这个改动是好还是坏呢?答案是我们可以自己跟自己比。持续监测通用送达率,比较改动前后的变化。
GitHub上有一个讨论Android推送的帖子(由@Trinea创建):
这个帖子从2015年5月份开始讨论至今,仍然没有人给出一个完美的解决方案。
随着各个手机厂商的市场份额的变化,以及推送平台市场的变化,Android推送也是一个不断处于变化中的话题。今天的结论,换到明天,也许就未必再适用。
所以,推送服务的实现者们也当然要拥抱变化。一定要确保你的推送架构能够很容易地切换某个第三方的推送渠道。
多年的创业经验告诉我们,不只是推送服务,也包括众多其它的云服务,仅仅依赖一家平台的做法,都是极其愚蠢的。
由于国内的各大手机厂商对于安卓系统做了各种不同的定制,增加了很多安全性的限制,导致推送成了一个很复杂的问题。而这个市场中又没有哪一家完美解决了所有手机设备的推送送达的问题。同时,微信由于其先发优势和规模优势,进入了各大厂商受保护的白名单,进一步拉开了与其他App在推送送达率上的距离。
最后不由得感慨一句,如果谷歌一直在中国,还会有这种乱局出现吗?
文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大
文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码
文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版
文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗
文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程
文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0
文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader
文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型
文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写
文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录
文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点
文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文