浅谈软件架构(三)
—— APNS
----cnyinlinux
本文将讨论的是常见软件架构中的三角关系——APNS。
APNS是Apple Push Notification Service的简称,即苹果推送通知服务。它用在当前很火热的苹果手机系统中。当然,它不是在手机iOS上运行的一个软件,而是牵扯普通APP应用商和苹果官方服务以及iPhone三方的软件架构。故而我把它称为三角关系。
这是一种新的架构,或者说模式,它并非传统的节点—服务器模式。目前微软的WP系统也采用此种工作模式。它的目标是:提高应用响应速度。
首先看一张图:
从图中可以看出,整个APNS的拓扑结构。如果拿腾讯QQ举例的话,“Provider”就是腾讯服务器(简称TS),“Client App”就是手机上的QQ软件。可以看到,APNS就横在你的QQ和TS之间。通常我们用QQ跟好友交际时,消息都会通过TS来转发。我们的好友列表等等也都是在TS上保存。这样一来,每一次QQ要向好友发消息,或者接受好友消息,都需要通过APNS过一次手。很多人就会说,这样不是反而使软件应用速度变慢了吗?似乎是这样的,但是看看后面的分析我们就知道真相了。
众所周知,苹果手机不支持后台进程,即你的QQ、微信等软件应用不能打到后台,这跟安卓的模式完全不一样。被打倒后台的App就会被剥夺CPU,甚至内存不足时也会强制清理掉该App所占内存。这也就是坊间传闻的“单进程模式”。
的确,iOS的资源管理思想与传统的多任务操作系统(Linux,Android等)不一样。所有资源管理权都交给系统,只有处于前台的应用进程才会被系统重视而集中服务,其他后台进程几乎被无视(除了极个别应用例外,如iOS自带音乐播放器)。所有的资源都尽量满足当前的前台进程,因此处于前台的进程响应速度会较快。这也就是苹果用户觉得iPhone速度快的原因。当然,APNS是同时服务于所有苹果用户的。
为什么苹果要这样设计呢?答案得从技术角度分析。我们都知道,一般而言,支持后台进程的系统,后台进程与前台进程区别不大,都有资源使用权,也都占用CPU运行。这样系统对应用App的管理是自由的。只要资源还有,谁想用都可以申请。很多流氓软件占用很多资源并没有有效利用(当然包括程序设计缺陷造成的资源泄漏)。如此一来,系统越用越慢,过一段时间之后几乎无法响应我们新的应用使用响应。所以用户不得不重启,这样全部应用占用的内存都被强制清零。这也是众多安卓机油的心声和经验吧。
因而,苹果采用了另一种思维。很多打到后台的应用,并不是用户当前高优先级在使用的程序,那为什么要让它在后台无止境消耗资源呢?干脆将后台程序全部停止调度,内存紧张时无条件回收后台进程占用的资源分配给前台进程。这样一来,就能极大保证当前正运行的App的一切资源请求,自然它就是运行最流畅的了。事实上确实如此,一般我们打到后台的进程就是当前不使用的,或者说是有别的应用要优先运行。所以关闭后台进程对我们的影响并不大。
那么,问题来了。如果打到后台就无法就被剥夺资源的话,那QQ和微信这种应用,一旦打入后台不就无法及时接收好友消息了??别急,APNS就是来解决这个问题的。
先看图,这就是APNS的工作模型:
当App到后台之后,它自己无法及时接收消息,这时候有一个人一直在运行着,而且始终运行着——内核,或者说iOS系统。如上图所示,当服务器(TS)有消息需要推送给客户端(QQ)时,TS将消息发送给苹果Server(APNS-Server),而后APNS-Server将消息推送给你的手机系统(iOS),然后iOS做出消息处理(推送提醒消息,标记App图标等等,这跟iOS的“通知中心”设置有关系)。这样用户就可以通过手机提醒或者应用图标知道有新消息。接下来用户决定是否处理此消息,点击通知提醒查看消息内容,亦或是点击App图标打开应用。具体的消息处理受App的设计决定,已不再是APNS的范畴了。
如此过程,就算是单进程的iOS也能使不在前台的进程接收到消息。即做到了单进程的快速响应,也兼顾了后台进程的消息推送。相比之下,安卓的客户端完全没有这样的过程,后台的客户端自己运行着与自己的Server建立通信,如QQ时刻在后台与TS进行网络通信。具体的通信细节属于iOS开发的知识,本文不作赘述。
iOS上如何实现消息通知的概略流程可参照下图。
用户打开App处理消息时,数据流向请参考下图:
<<本文完结>>