Android-离线推送的苦恼

6,223 阅读3分钟

背景:由于国内能买到的安卓手机都没安装谷歌服务框架,所以造成了如今国内安卓手机无论使用哪种第三方平台推送服务, 都无法实现百分百的安卓设备离线(杀掉app)收到推送。(为什么苹果推送没有这个烦恼呢?原因是苹果推送走的是系统推送,由系统去维持长连接通道,所以app杀掉也能收到推送。)

第三方推送平台:

  1. 极光推送支持的厂商通道:华为、小米、魅族、OPPO、FCM
  2. 友盟+支持的厂商通道:华为、小米、魅族、OPPO、vivo

各大厂商推送情况:

  1. 小米:支持接收离线消息,可以直接获取推送的发送数、送达数(率)、点击数(率);
  2. vivo:支持接收离线消息,可以直接获取推送的发送数、送达数、点击数、展示数(不知道和送达数有什么区别?);
  3. 华为:支持接收离线消息,仅提供消息回执的方式获取消息送达情况,不提供获取点击数信息;
  4. 魅族:支持接收离线消息,仅提供获取时间段内的消息情况(送达数和点击数),不支持获取某条推送消息的送达情况;
  5. OPPO:不开放,内测中。

使用第三方的集成厂商推送:

好处:

  1. 后台推送时,只需调用该第三方的推送api就可以实现消息推送;
  2. 统计数据更方便、快捷、相对准确;
  3. 开发效率更快,节省后台开发人力成本;
  4. 根据厂商通道也可以实现离线消息推送。

坏处:

  1. 价格比较贵

自行集成厂商推送:

好处:

  1. 确保离线消息送达
  2. 省钱

坏处:

  1. 后台需要接入多个厂商的推送和统计api(有些厂商使用消息回执反馈送达情况,如:华为)
  2. 厂商推送不完善、存在的限制(缺陷):
    1. vivo推送接口访问频率有限制,需要根据错误码自行控制请求频率;每天仅支持一次全量推送,推完之后就要使用批量推送代替,推送次数有上限(SDK订阅数不超过100000,则10000次/天),推送时间限制:7:00~23:00 等等;
    2. 华为推送不提供全量推送接口;别名是从客户端调SDK获取,不是自己上报的,一次只能推送100个用户 等等;
    3. 魅族不支持获取某条推送消息的推送情况,只能根据时间段获取推送情况 等等。

我公司的实施方案:

  1. ios:

    1. 直接使用第三方平台推送——极光推送
    2. 送达统计:免费版即可获取送达数和发送数
  2. Android:

    1. 接入厂商通道:小米、vivo、华为、魅族
    2. 其他安卓设备(用户群少):第三方平台推送——极光推送(放弃接收离线消息)
    3. 送达统计:小米设备送达数+vivo设备送达数+华为设备送达数+其他设备(极光推送)送达数
  • 推送点击统计:使用消息点击事件,客户端请求后台API,反馈点击的消息ID,后台根据客户端的设备信息自行判断处理累加推送点击数(需要区分设备系统)。

走过的弯路:

  1. 统计点击数使用定时任务的方式(每隔10分钟),调接口获取一个小时内的推送消息点击数。后来发现只有小米和vivo提供了接口,其他厂商通道和极光推送(免费版)都不支持获取统计数。

可优化的方案:

  • 方案一: 直接接入第三方推送平台,升级为vip,享受集成厂商推送(极光推送/友盟+/...),一劳永逸。
  • 方案二: 自建长链,存储用户在线情况:在线推送(第三方推送平台)+ 离线推送(厂商推送)。