iOS

iOS和android的推送机制分析

RT

Posted by Renchao on August 1, 2017

iOS和android的推送机制分析

iOS-APNs大中枢

iOS的推送中心叫做APNS(Apple Push Notification service),苹果公司统一的推送平台,也就是说全球所有使用苹果的设备,想接到通知必须经过APNs这个大中枢。

简单来说,苹果设备联网后,发送消息给APNs中心,中心就会知道有这个设备的存在了。注意这里是设备(iOS系统)发送消息而不是APP,这可能也是国内iOS和安卓通知的最大区别。中心里有需要下发的推送时,就将消息发送给设备,设备再通过分析哪个应用来分发到不同应用上。

详细说,iOS后台有一个全局系统级常驻进程,端口号为5223,服务器和该进程长连接,推送来了就可以分发给不同应用。

这种技术,说起来很简单,但是是非常了不起的架构。使用久经考验的协议,技术风险小。苹果需要维护一个代价不小的服务器集群,而且要为服务器的 宕机负责。对用户来说,安全,只有注册过的开发者才能通过APNs推送。苹果掌握服务器和iOS,快速稳定可靠。让整个系统的体验更统一和简单。 不会出现杀后台这种脑残事(不用大量 Apps / Apps 的服务为了推送挂后台),省电、省内存(所以你看安卓占用内存太大,很多都是因为App在后台注册服务,占用内存等推送),所以iPhone的电池容量很小但还是很耐用。也不会出现 Apps 被杀就收不到推送这种脑残事(早一点的新浪微博 Android 版仍然如此)。

关于服务器如何先找到设备、再找到app的问题。每一个设备都有一个自己的设备号,而设备中的app又都有一个唯一的包名。所以服务器只需要找到设备号与包名就可以定位到某个设备的某个应用,而这设备号与包名会一起构成一个标识符,叫做device_token,因此问题就简化为把device_token与消息内容等信息交给服务器,服务器把内容发到唯一的device_token上。

img

img

首先作为设备标识的device-token是由APNs颁发的,App开发者或者第三方推送平台(图中的Provider)做的工作是收集这个device-token,APNs的推送是要求基于APNs颁发的device-token来推送的。只有正确的device-token会被APNs接受,如果是一个错误的、或者无效的device-token(比如App已经卸载了),APNs就不会接受。

接着开发者使用第三方推送平台(图中的Provider)在将推送内容与范围选定之后进行推送,第三方推送平台将信息提交给APNs,剩下的操作全部都由APNs来进行完成,整个过程第三方推送平台就不能控制了。 但是如果提供的device_token是失效的(app被卸载、系统版本升级导致device_token变化等情况)那么推送过程就会被中断,频繁的断线重连甚至会被APNs认为是一直DoS攻击。详情可以参考为什么苹果的推送,两次推送之间间隔比较久的话,第二次推送会很慢? - 沙漠的回答

比如说,腾讯 QQ 的服务器(Provider)会给苹果公司对应的服务器(APNs)发出通知,然后再中转传送到你的设备(Devices)之上。当你接收到通知,打开应用,才开始从腾讯服务器接收数据,跟你之前看到通知里内容一样,但却是经由两个不同的通道而来。

android-到底是安卓还是android

Android原本是可以使用Google自家的GCM(Google Cloud Messaging)的,但是在国内就只能用第三方的推送平台,原因大家都懂的,所以说安卓和android是有区别的。。。

国外来说,完整的谷歌服务,统一的推送中心,和iOS推送非常类似。但在国内,安卓时需要APP自己不断发送请求告诉APP自己的服务器,我连着网呢~有消息就会传给App。技术上说,这就是长连接,实现方式是心跳包。如果很长时间没有心跳包,则服务器就认为该APP“死”了,也就是没有网络连接,而当联网后,只要APP还在后台(前台)运行,就会立刻告诉服务器,我连网了,可以发推送了。

Android平台,Android平台在不使用GCM的情况下就需要将自己的服务器或是第三方推送服务提供商的服务器与设备建立一条长连接,通过长连接进行推送。但是不建议自己设置服务器实现推送功能,一是因为成本太高(开发成本、维护成本),自己搭建的服务器无论是稳定性还是速度上都比不了第三方推送服务提供商的效果。另一个是因为自己的数据量较小,使用第三方推送服务提供商可以用他们的维度进行推送,实现精准推送。友盟推送就是做的比较好的,可以根据用户分群、地区、语言等多维度进行推送,最大程度减少对于用户的干扰,仅把消息推送给相关用户。友盟推送的优势是什么? - 李琰的回答

下图是Android平台消息推送的简单示意图:

img

开发者通过第三方推送服务提供商将信息直接下发给需要的设备,第三方推送服务提供商与设备建立一条长连接通道,并且将消息路由到APP中(图中的设备1与设备2),对于像设备3这种无网络连接或是没有成功建立长连接通道的设备,会在设备3连网且推送消息没有过期的情况下自动收到由第三方推送服务提供商推送过来的消息,保证消息不会丢失。

最近好像工信部将要成立安卓同意推送联盟:

工信部将成立安卓统一推送联盟

目前在国内的安卓生态相当混乱,其中的表现之一便是各家App均在手机后台预留了消息接收服务,通过不断与服务器连接获得新消息,由于每款App唤醒手机的时间不同,后台耗电与内存占用着实影响了国内安卓手机用户的正常使用,在未来统一接收标准后接收消息耗电问题将会被尽可能降低,与此同时也降低了开发者的开发成本。

感谢

iOS 和 Android 的后台推送原理各是什么?有什么区别?-李琰的回答