第三方推送已死

智码拾光者
• 阅读 8888

国内第三方推送的起源

2010 年左右,Android 手机在国内迅速发展,Google 的原生推送(C2DM,现在的 GCM)由于种种原因不能正常使用,当时的 Android 开发者使用各种办法来解决这个问题,其中就包括 Android 手机厂商开发出自己的推送方案。

对于大部分开发者来说,除了做一个 App,还要独立开发一套推送系统是件异常困难的事情。哪怕是用户数量很大的 App ,这也不是一件容易的事情。于是在 2011 年底,我产生了做独立第三方推送服务的想法,也就有了后来的极光推送。

推送消息能送达的关键

这几年经常有业内的朋友探讨推送能否送达的关键因素。其实最重要的是 SDK 能否保活。

具体地说,有以下两方面:

SDK 如果不能及时地发起心跳,运营商网络的长连接会被断开。

SDK 的任务如果被杀掉了,不能被拉起,消息就完全没有机会下发。

参考之前的文章:《推送技术原理》 http://zhang.hu/mobile-push/

如果 SDK 端不能有效地保活,那么无论服务器端怎么优化,都不能保证消息及时地送达。

对 Android 手机厂商来说,这里有一个矛盾的问题。手机厂商都希望自己出产的手机能有尽量长的待机时间,但是 App 定时在后台启动、维持心跳的行为,会极大地影响手机待机时间。

因此,最近几年,手机厂商为了控制后台服务,持续地推出各种限制手段。比如之前的心跳对齐,也就是不允许 App 任意使用 RTC 后台唤醒手机。还有更严厉的手段,就是定时清理所有后台服务,并且不允许服务通过监听广播自动拉起。

第三方推送已死

正如前文所提到的,最近主流的 Android 手机都会清理后台服务,禁止服务自动拉起,以前各种 SDK 保活手段相继失效,这个问题从根本上动摇了 Android 第三方推送服务的基础,导致几乎所有的 Android 第三方推送服务都不能保证送达。

所以,如果推送服务商还在使用以往相互拉起的技术手段,那么我们可以断言,第三方推送已经在走向死亡。

面对这样的问题,App 开发者该如何应对?

更合理的方案

因为推送服务的特点,它最应该以系统原生服务的形态存在。在 iOS/Android 系统推出的早期,都考虑到了这个问题,iOS 有 APNs,Android 有 C2DM(GCM)。可惜的是,Android 的 GCM 在国内早已不能被有效使用,而 Android 方面没有试图解决这个问题,而把问题留给了手机厂商和 App 开发者。

考虑到推送服务的特点,我们自然而然就想到了通过厂商的推送通道来解决这个问题,就像在 iOS 上使用 APNs 一样。使用 App 内的消息通道发消息给 App,再通过厂商的推送通道唤醒 App,App 被打开后,接受消息通道的离线消息。

从目前的实践情况来看,这是解决后台进程被清理的最有效办法。

第三方推送已死

国内 Android 厂商推送通道现状

目前国内几个主要的 Android 厂商中,小米、华为 都有提供官方的推送服务。经过我们团队的验证,他们的推送服务在自己品牌的手机上,有相对稳定的送达率。目前表现最好的是小米,华为的推送延迟有时比较大,也不太稳定。

而另外的几家 OPPO、VIVO、金立 都没有官方的推送服务。

云巴近期推出了一键集成 小米、华为 推送的功能,方便开发者快速集成厂商的推送服务。但是对于没有提供推送服务的厂商,目前还没有特别好的办法。我们期待各主流手机厂商为了 App 有更好的体验,都能提供解决这个问题的方案。

文章作者:@Tiger_张虎 ,云巴 (yunba.io) 创始人,yunba.io 云端实时消息服务。 JPush 创始人,原CTO。 Oracle VM 创始团队成员。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android 服务器推送技术
在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。在Android手机平台上,Google提供了C2DM(CloudtoDevi
Stella981 Stella981
3年前
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。自从AndroidP(即Android8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《AndroidP正式版即将到来:后台应用保活、消息推送的真正噩梦(https://www.oschina
Wesley13 Wesley13
3年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
可莉 可莉
3年前
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。自从AndroidP(即Android8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《AndroidP正式版即将到来:后台应用保活、消息推送的真正噩梦(https://www.oschina
Stella981 Stella981
3年前
JVM 字节码指令表
字节码助记符指令含义0x00nop什么都不做0x01aconst\_null将null推送至栈顶0x02iconst\_m1将int型1推送至栈顶0x03iconst\_0将int型0推送至栈顶0x04iconst\_1将int型1推送至栈顶0x05ic
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
融云IM即时通讯 融云IM即时通讯
7个月前
融云IM干货丨如何在iOS和Android平台上实现推送通知自定义?
在iOS和Android平台上实现推送通知自定义,可以按照以下步骤操作:iOS平台自定义推送通知:启用推送通知功能:在Xcode中,为您的AppID启用推送通知功能。这可以在Apple开发者账户的Certificates,Identifiers&Profi
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(