软件架构杂谈(三) --- APNS

浅谈软件架构(三)

—— 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处理消息时,数据流向请参考下图:

<<本文完结>>

时间: 2024-10-06 01:04:56

软件架构杂谈(三) --- APNS的相关文章

Java杂谈三之判断素数以及穷举素数

首先确认下什么是素数,又称质数 百度的定义解答: 质数(prime number)又称素数,有无限个.一个大于1的自然数,如果除了1和它本身 外,不能被其他自然数整除(除0以外)的数称之为素数(质数) 明确了素数的定义后,下面用java来判断素数以及穷举2-999以内的素数,还是一样,主 要看的是对一个数进行判断或者对一组数进行判断的思想,至于怎样判断的,百度的定义已经给了很好的解答思路. JavaPrimeNubmer:类名 enumPrimeNumber():穷举2-999以内的所有素数 m

软件架构杂谈(一)

浅谈软件架构(一) 这个世界上,被人们创造出来的软件架构大概已经有几百种之多了.当然,它们所处的层次,以及应用范围是不同的.本文讨论的是,工作在协议顶层--即应用层,且是机器间联网工作的软件架构.(由于内容荣杂,本文将分多个期次介绍,请读者关注后续博文) 开篇 行文将讨论的软件架构为以下7类: 1. C/S 2. B/S 3. Cluster (HA) 4. Cloud 5. Distributed 6. APNS-like 7. P2P 一,C/S架构. 这个词汇可谓老生常谈了.自高级语言编程

软件架构杂谈(二) --- Cluster (HA)

浅谈软件架构(二) cnyinlinux 之前发布过的博文,已经对C/S和B/S作了讨论,本文将讨论的是集群-Cluster. 1. C/S 2. B/S 3. Cluster (HA) 4. Cloud 5. Distributed 6. APNS-like 7. P2P 集群的技术是近年来计算机应用大规模普及,以及性能要求逐渐提高的形势下提出来的.简而言之,集群就是一批独立计算机联合运作处理某一高要求任务的技术.其建立在网络互连的基础上,核心是节点间任务分配--调度算法. 集群有几个显著特点

软件架构杂谈(四) --- P2P

浅谈软件架构(四) -- P2P ----cnyinlinux 本文将讨论一种特殊的软件架构--P2P网络.这与时下正流行的O2O有些神似,不过二者没有联系,也不是同类物种.O2O指的是互联网虚拟世界(Online)与显示世界(Offline)的协作模式.而P2P指的是同处在互联网世界中的两个节点(对等终端)之间的情仇爱恨.因此也有人称之为对等网络. 和今天热炒的"去中心化"有着不可割舍的关系.还有一个神奇的物种与它有着绝对关联关系--比特币.下面我们来研讨下P2P网络的原理. P2P

C++杂谈三产生随机数与time函数

%5Bdjango%5D%E8%A1%A8%E6%A0%BC%E7%9A%84%E6%B7%BB%E5%8A%A0%E4%B8%8E%E5%88%A0%E9%99%A4%E5%AE%9E%E4%BE%8B%E5%8F%AF%E4%BB%A5%E5%80%9F%E9%89%B4%E5%8F%82%E8%80%83 ?????4SL6vyEg??????????? http://auto.315che.com/aodiq3/qa23880202-2.htm http://auto.315che.co

软件架构(一) 软件架构

本文主要阐述什么是软件架构.软件架构的重要性.什么时候软件架构尤其重要.什么是推定架构以及软件架构的三种使用方式. 1.什么是软件架构? 架构与详细设计 软件系统的设计由开发者的决策与意图组成.设计可以被划分为软件架构和详细设计. 专家们一致认同架构的主干,但是在细枝末节上却存在分歧,比如何时终止架构的设计而开始详细的设计. 在实践中,也很难将架构和详细设计区分开来. 卡内基·梅隆大学软件工程研究所(SEI)对软件架构的定义: 计算系统的软件架构时解释该系统所需的结构体的集合,其中包括:软件元素

向架构师进军--&gt;可重用架构资源

如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 软件架构有三个主要来源:拿取.方法以及直觉.拿取也就是可重用资源.对于一个标准的系统而言,可能包含80%的拿取.19%的方法和1%的直觉.而崭新的系统则包含30%的拿取.50%的方法和20%的直觉.由此可见,拿取在软件架构中的重要性,本节我来带领大家了解可重用架构资源. 一个可重用资源可以代表一个可重用需求(在不同系统里反复出现的需求).可重用的解决方案元素(一个架构模式或者可重用代码).可

编程书籍推荐——按角色划分

一.软件工程师 Clean Code<代码整洁之道> Implementation Patterns<实现模式> Code Complete<代码大全> Refactoring: Improving the Design of Existing Code<重构——改善既有代码的设计> Effective Java(第二版) Head First Design Patterns<深入浅出设计模式> Agile Software Developmen

软件行业人员书单

书籍推荐(转自豆瓣) 一.软件project师 --Clean Code<代码整洁之道> --Implementation Patterns<实现模式> --Code Complete<代码大全> --Refactoring: Improving the Design of Existing Code<重构--改善既有代码的设计> --Effective Java(第二版) --Head First Design Patterns<深入浅出设计模式&g