关于"消息推送"的误解
最新资讯 • U-Push
41416
2019-3-14
摘要:
结合产品运营过程中,开发者常见的一些问题,持续更新中。

Q: 消息“送达率”是100%的,如果做不到100%,那么服务就是有问题。 

A: 其实不是的,即使是成功率非常高的短信(SMS),送达率也做不到100%,总有关机的用户吧?总有废弃的号码吧?消息推送的技术原理是要依赖于稳定的长连接通道,受网络、后台Service、系统以及厂商ROM等多重限制,很难做到100%。有经验的开发者伙伴一定知道,App的送达率其实是和App自身的日活正相关的,可以想想App自身是不可能有很高的日活用户比例(微信这类超高频App除外),所以App的送达率也是一样的道理。关于送达率的解释,请参考这个帖子: “谈谈消息推送的送达率”

Q: 我在服务器端发送了10W条消息,最终统计到的收到数是4W,那么送达率就是40%了? 

A: 不是的,这里其实还是要看看送达率的概念,参照 “谈谈消息推送的送达率”,这里一个核心问题就是分母怎么定义。一般来说,开发者发送到友盟的设备,友盟服务器还要做有效性判定(比如device token是非法的,token发生了变化,旧token已经失效等),真正发送的对象是链接里面提到的“有效数/接收数”,分母要按照“接收数/有效数”来计算。

Q: 我手头两个机器测试,发现有1部手机总是收不到消息,那么送达率只有50%? 

A: 样本太少了,任何XX率的计算,肯定要有一个非常大的样本集合。由于国内Android机型的碎片化现象,不同厂商上推送服务的表现可能区别会很大,经常会出现推送服务在某些机型上工作的比较正常,有某些机型表现不太好的现象,友盟+Push SDK要做的就是尽可能去适配各种机型,保证在大部分情况下均可以正常work。如果要评估送达率,最好是能灰度发布一批线上设备,针对这批灰度的量做一下实际测试,这样得到的结论会准确一些。

Q: 在三星手机上App退到后他是能收到消息的,但是在小米手机上App退到后台就收不到消息了,是不是push sdk有问题? 

A: 不是的,这种情况下一般是用了小米系统的“一键清理”功能,把App进程清理了。MIUI上对推送服务做了限制,如果App被杀死了,是不允许收到消息的。这个是系统的限制,不是Push SDK的问题。常见特殊机型整理见这里。

Q: 集成了友盟推送,测试了强杀App,断网恢复网络,发现消息有的时候收不到,是不是Push SDK有问题? 

A: 不一定是Push SDK的问题,如上个问题所述,有的时候是系统或者厂商ROM自身会做一些限制,比如App被强杀掉,对应的push service也会被清理掉,有的时候是push SDK的一些策略,比如考虑到省电的因素,长连接的心跳探测不一定非常频繁,导致断网重连不一定能及时感知到。这里也建议开发者测试的时候,尽量先保证SDK能在正常情况下工作,之后再去测试像"强杀、一键清理、网络切换、开机重启"之类的测试用例,不同机型表现都不太一样,大家可以在我们文档或者论坛上多搜搜已归档的问题或者解决方案。

Q: 只要集成了友盟推送,在任何情况下均可以收到消息。 

A: 不是的,如前面问题所述,推送是有送达率的概念的,以及在客户端上,系统、网络等多方面的影响因素均会影响到消息的成功接收。

Q: 我的设备是联网了,那就表示“设备在线”了,应该能收到推送消息吧? 

A: 不是的,“设备长连接”在线是消息能顺利下发的前提,“设备长连接”在线的含义是: 1. 设备联网;2. 设备上的Push Service存在; 3.Push Service与服务器端已经建立起长连接通道。有了这3点保障,才算是“设备长连接在线”。设备联网只是其中一个必要条件。

Q: 服务器端调用推送API显示成功了,客户端也会同步收到消息。 

A: 参考这个帖子: “调用服务器端API接口返回成功,为什么客户端没收到消息?”

Q: iOS推送和Android推送原理是一样的。

A: 本质上,技术原理是一样的,都要用到长连接技术。实际在实现上,Android是友盟自建推送系统,iOS用的是苹果官方的APNs(Apple Push Notification Service)系统。

Q: Android平台的推送提供“收到”、“打开”和“忽略”数字,iOS平台也会提供。 

A: 不是的,接上一个问题,因为苹果使用的是APNs推送,苹果只开放“打开”这个接口,所以iOS平台我们提供 “推送到APNs数”和“打开数”,iOS平台目前是统计不到消息送达的。

Q: Android推送平台,推送完消息后,过了3个小时设备才收到,这延迟太大了。。。 

A: 不是的,目前系统能做到,在“设备在线(设备联网&长链接PushService存在&与服务器端建立了长连接通道)”的情况下,即发即到。 如果出现长时间的延迟,可能发消息的瞬间,设备的长连接Service不存在,或者存在的话,可能没有和服务器端建立通信连接,后来设备在线了,之前保存的离线消息又下发下去了。可以参照“设备状态离线排查”

Q: 调用服务器端API接口成功,但是实际上设备没收到消息,是不是友盟推送服务出问题了呢, 是延迟吗?

A: 不是的,请参考“API返回接口成功,但是设备端没有收到消息原因排查”

Q: Android推送连续发送了好几条,发现客户端只收到了一条,是不是消息有丢失呢? 

A: 不是的,我们在客户端做了体验优化,如果使用默认通知栏样式,同时送达多条消息的时候,默认是只展示最后一条通知。如果想要展示多条消息,请在SDK集成文档中找一下对应的设置方法。