Unity IOS Android 消息推送原理分析

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:李琰
链接:http://www.zhihu.com/question/20667886/answer/80539929
来源:知乎

现在手机主流的几个平台都有自家提供Push的功能,让应用开发者能够很方便地把Push能力集成到应用中。

Android 上有 GCM (Google Cloud Messaging)
iOS 上有 APNs(Apple Push Notification service)
Windows Phone 上有 MPNs(Microsoft Push Notification service)。

但是由于Windows Phone的市场占比不高,所以一般也就没有人会专门做wp系统的推送。至于Android的GCM在国内基本上是不可用的。原因主要有以下两点:
一、国内大部分Android手机都不带Google服务,也就用不了GCM,这是主要的问题。
二、在国内Google的服务一般都不太稳定,原因你懂的。
所以现在在做消息推送的时候Android平台采用服务器与设备直接拉一条长连接的方式实现功能,而IOS平台则采用苹果自己的APNs服务。

在分别说这两个平台推送原理的时候,先回答一下题主关于服务器如何先找到设备、再找到app的问题。每一个设备都有一个自己的设备号,而设备中的app又都有一个唯一的包名。所以服务器只需要找到设备号与包名就可以定位到某个设备的某个应用,而这设备号与包名会一起构成一个标识符,叫做device_token,因此问题就简化为把device_token与消息内容等信息交给服务器,服务器把内容发到唯一的device_token上。这就好像你在上海要通过顺丰寄送一个快件儿给某某小区的某某房间,那么快件儿首先会邮递到顺丰公司在北京的总站点,之后再根据小区的地址投递/路由到某某房间,这样一个寄件过程就算完成了。在这里,你要寄送的快件儿就是你要发的“消息”,送达房间相当于最终“接收消息的App”,顺丰公司在北京的总站点相当于这里提到的“设备”,送达房间的房间号就相当于这个环节里面提到的“包名”。

接下来分别简单说一下这两个平台的推送实现原理。
首先是IOS平台,IOS的推送是通过苹果自己的APNs服务进行的,用户需要将device_token以及消息内容等推送信息交给APNs服务器,剩下的均由苹果自己来完成。
iOS应用的推送大部分情况下都要依赖苹果生态提供的APNs( Apple Push Notification Service )服务。

下边用两幅图来简要说明其推送原理

Unity IOS Android 消息推送原理分析_第1张图片


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

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

Unity IOS Android 消息推送原理分析_第2张图片


开发者通过第三方推送服务提供商将信息直接下发给需要的设备,第三方推送服务提供商与设备建立一条长连接通道,并且将消息路由到APP中(图中的设备1与设备2),对于像设备3这种无网络连接或是没有成功建立长连接通道的设备,会在设备3连网且推送消息没有过期的情况下自动收到由第三方推送服务提供商推送过来的消息,保证消息不会丢失。
对于消息推送想要了解更多,可以关注各推送服务提供商(友盟推送、百度云推送、极光推送等)的官网及论坛。


你可能感兴趣的:(unity3D)