场景如下

QQ/WeChat:

  • A:我给你发消息你怎么半天没回?
  • 我:有事请 Telegram 联系,QQ/WeChat 随缘回复。
  • A:这跟 QQ/WeChat 私聊有什么区别?为什么要这么麻烦?
  • 我:(此处省略 1000+ 字)

忽然我意识到了,其实大部分人对自己的 IM 软件一无所知,那么一篇有必要的科普文章就应该开始动手了。Telegram 的优点当然不仅在于通知推送,但是我想从通知推送说起……

声明

  • 限于篇幅,这篇文章并不会太多牵扯到手机通知推送的技术细节。(毕竟主要是科普嘛~~)
  • 文章内容仅代表作者个人认知和观点,欢迎发表你的观点。
  • 文章内容限于作者能力可能存在某些错误,欢迎指出。

iOS 的通知推送

说起手机推送,不得不先提的是 iOS 的通知推送。

即使你是一个数码小白,至少也听说过 iOS 通知的及时。当然,你可能看到的是吐槽 Android 通知多么垃圾,这其实是反衬 iOS 通知的强大。

这里简单介绍一下 iOS 通知推送机制。

本地推送

本地推送其实就是 App 的定时推送。App 注册本地推送通知,指定一个时间并在该时间推送通知。

远程推送

前提已满足条件:App 已注册远程推送通知。

Apple 开发者文档给出的推送过程示意图如下:
通知推送示意图

用文字描述过程如下:

  1. 软件需要推送通知
  2. 软件服务器将通知推送到 Apple Push Notification service(APNs)
  3. Apple Push Notification service(APNs) 将通知转发给用户。

可以看到,这全过程都是由 Apple Push Notification service(APNs)完成通知的接收与发送,并且最后的通知推送也是由系统进行统一推送。这一过程中,设备上的软件本身没有参与

也就是说,iOS 通知推送并不需要软件的后台运行。完全由 Apple Push Notification service(APNs)和 系统 完成通知推送的方式实现了最大化的通知效率。别羡慕了,羡慕就去买台果子吧。

Android 的通知推送

这里首先为被风评被害多年的 404 小厂的操作系统辩解一番。人家一个官网都常年打不开的小公司,怎么可能实现像 Apple Push Notification service 这样大体量的通知推送服务。(雾)

如你所见,由于某些众所周知的原因,Android 的系统推送通知一直处于一个尴尬的情况 (指国内) 。于是在长期以来的 Android 发展中,各大公司群策群力,纷纷贡献自己的金点子银点子,携手解决这一难题。

Google 的 FCM

严格意义上来说,某 404 公司对于自己操作系统的推送服务还是有进行一番 无意义的挣扎 努力。

2010 年,在 Apple 推送通知服务发布后,Android 2.2 也马上推出了「云端至设备消息传递(Cloud to Device Messaging」,即 C2DM。

2012 年 404 小厂推出「Google 云消息传递(Google Cloud Messaging)」,即 GCM。GCM 取代了 C2DM 并实现了更好的功耗表现,且对于开发者更加友好。

2014 年某 404 小厂收购 Firebase 后,将 GCM 改名为「Firebase 云消息传递(Firebase Cloud Messaging)」,即 FCM。FCM 较之 GCM 则更进一步简化了推送服务相关的开发工作。

FCM 示意图

从原理上来看,FCM 和 APNs 一致,也是按照 软件服务器 ==> FCM 服务器 ==> 用户 这一流程实现的。

也就是说,对于 Android 系统 FCM 推送,整个推送过程中的 通知的接收与发送 都由 FCM 完成。这一过程中,设备上的软件本身没有参与

虽然可能和你以前想象的不太一样,但是事实如此:Android 系统同样有一套较为完善的推送机制,这个推送机制绿色高效,实现原理类似于 Apple。

不过想法是美好的,现实是残酷的。因为种种原因,FCM 在国内并不能正常使用,主要原因如下:

  • FCM 依赖 Google Play Service 而绝大部分国内 Android 手机都阉割了 Google Play Service。
  • 大部分国内 App 都没有注册 FCM(不支持 FCM)。
  • FCM 在国内的连接不稳定。

对于已安装 Google Play Service 的用户,可以在手机拨号盘输入 *#*#426#*#* 查看你当前的 FCM 连接状态。

FCM 已连接示意图

各大互联网公司的解决方案

由上面的叙述我们可以知道,404 小厂的 FCM 是靠不住了,关键时刻还是需要我们自力更生,自给自足。

事实上,这种小问题根本难不倒我们大天朝的互联网公司,以阿里巴巴等互联网巨头为首率先想出一种行之有效的解决方法——团结就是力量

可能上一段你看得有点懵,但不要紧,我给这种解决方法换一个更广为人知的名字你就熟了——链式启动

互联网公司通过自己的软件全家桶或和其他互联网公司相互合作,以相互唤醒的方式保证自己全家人后台存活,然后团结一致完成通知推送(当然也可能顺便干一点别的东西)。

简单来说,如果这些软件中有一个不慎倒下了(后台被杀死),其他软件会迅速将其拉起,保证其在后台始终处于唤醒状态,让共用的推送通道保持活跃而不被系统杀死,以便消息能及时送达。

这一方法简单粗暴,不仅体现了化繁为简这一哲学思想,更是弘扬了社会主义团结互助的精神,再次告诉我们什么叫做团结就是力量!(此处应有掌声)

当然,这种方法还是有一点点小小的弊端,那就是手机耗电有点快,可能还会有点烫有点卡。但是瑕不掩瑜,这点小问题和这天才般的创意比起来算什么呢?

手机厂商的推送服务

面对 群魔乱舞的 Android 推送问题,终究还是有手机厂商站了出来,模仿 Apple 和 404 小厂的做法建立了他们自己的推送服务,比如小米的「MiPush」。

这些推送服务被集成在各厂商高度定制的 Android 系统中,作为系统级推送存在。手机厂商试图通过模仿 Apple 和 404 小厂实现同等程度的通知绿色与时效性。

但想法是美好的,事实上,开发者不可能兼顾所有的厂商,为每个品牌的手机都适配对应的推送服务,能专门适配其中一家到两家已经是很良心了 (试图为某鹅狡辩) 。除此之外,虽然手机厂商的推送服务也可以在其它品牌的手机上正常使用,但并不能像在自家定制系统上一样实现系统级的推送,推送服务依旧需要后台常驻。

也许是黎明的曙光——统一推送联盟

不知道你有没有听说过 Android 绿色应用公约。如果没有听说过也没关系,现在你知道了。

宗旨

这是一项旨在推动 Android 生态中的优秀应用共同维护一个更加良性的『设备体验』而发起的开放公约。

核心原则

  • 完全遵照 Android 本身的演进方向(包括 Android O 所引入的新变化),积极引导和协助应用开发团队平滑完成对接 Android 最新变化的节奏,在确保应用核心功能不受影响的前提下,减少不必要的应用后台行为,并以更加高效、节能的调度机制改善后台行为的调度。

  • 公约的必要规约中,只纳入可被明确验证的条款,不接受需要主观裁量或定义模糊的条款(例如涉及交互设计的内容)。

  • 所有约束条款均给出推荐的最佳实践或具有可操作性的调整方法。

  • 涉及到功能与设备体验之间的潜在冲突时,遵循最终选择权给予用户的原则。

——《Android 绿色应用公约 4.0》

虽然在我看来公约里的部分 App 也不怎么绿色。

我们可以看到,在 Android 绿色应用公约中的互联网大公司的软件屈指可数。(好吧,别自欺欺人了,是基本上没有,有的也不咋绿色)

这说明了,仅仅靠各公司的自觉或社区推动实现国内 Android 生态 App 绿色化是不现实的,而通知这个关键点更是每个公司都不愿意松手。

这时候,需要有更强大的力量站出来,整顿当前国内 App 的通知推送乱象。于是,统一推送联盟出现了。

统一推送联盟成立于2017年10月,挂靠单位是电信终端产业协会(TAF),接受工业和信息化部业务指导,住所设在北京。联盟核心任务是:探索推送行业创新,促进终端生产厂商、应用开发厂商和第三方服务提供商等进行深入合作,整合行业资源,助推形成统一的推送体系,创造绿色环境,减少与终端用户的利益冲突,提升整体行业形象,降低整体行业的实现成本,形成自律基础上的产业链协同发展,实现产业的共同繁荣。

统一推送联盟是在自愿、平等、互利、合作的基础上,由国内外消息推送产业相关的企、事业单位、社团组织、高等院校、科研院所等自愿结成的跨行业、开放性、非营利性的社会组织。本联盟旨在促进相关主体之间的交流和深度合作,促进供需对接和知识共享,形成优势互补,有效推进消息推送产业的发展,切实解决产业现实问题。

——统一推送联盟《关于我们》

事实证明统一推送联盟是实现了巨大的影响的。

不到两年时间里,统一推送联盟就实现了由「全民讨论统一推送后 Android 美好的幸福生活」到「全民讨论 统一推送联盟 到底黄没黄」的巨大转变。

但是,我们要客观、发展性地看待问题,统一推送联盟一直在时刻努力着,前段时间还发表了一篇名为 《统一推送能给手机带来什么?》 的科普性文章。文章底部留言中,官方更是回复「推必达将于近期上线」。
官方回复「近期上线」

我也不知道我有生之年能不能等到这天了。

题外话:让我们回头看看 QQ/WeChat

看到这里,你大概对手机系统推送有了比较全面的了解。

那么你一定好奇,国民级软件 QQ 和 WeChat 是怎么实现手机通知推送的。

iOS 当然没有任何疑问,通过 Apple Push Notification service。

Android 上则一言难尽,因为这两个 App 都没有注册任何一个推送服务忘了 Google Play 版 WeChat 的 FCM 吧,它能不能推送完全看脸

没有注册推送服务意味着 QQ 和 WeChat 在 Android 上实现通知推送全靠后台常驻。微信尤甚,某个进程挂了,整个 App 都收不到通知

保证 QQ 和 WeChat 的通知时效性一直是困扰大部分开发者和所有国内手机厂商的难题。对此大部份国内手机厂商的解决方法都是对 QQ 和 WeChat 后台无限制以最大程度保活,实现通知推送正常。

而此时,Telegram 支持 FCM 的优点就体现出来了——对于我来说,我能第一时间收到你发给我的消息并回复,而 QQ 和 WeChat 还得等上一阵子。我希望私聊我的人用 Telegram 而不是 QQ 和 WeChat 的原因很简单:

我不想浪费我的时间在无意义的事情上,比如保证 QQ 和 WeChat 能及时收到消息。

如果你用某一品牌的手机,QQ 和 WeChat 经常收不到消息,请不要咒骂这个手机厂商。如果可以的话,请劝告你身边的人也不要这样做。手机厂商也在尽自己最大的努力,只不过他们只能尽人事听天命。


参考链接:
太多了,有缘再整理吧…