iOS远程推送的原理

昨天晚上开会讨论项目的技术难点,所以问到了推送的事情,有几个应用场景的实现忘了,所以又重新看了一遍,总结这个博客,希望能对看到的人有所帮助。

我这里只说远程推送,本地推送就不说了,因为不涉及到服务器交互。

说到推送不得不提到APNs(Apple Push Notification Service),出去别人问你懂不懂APNs一定要知道是这个。

以下场景以QQ为例:
1、手机只要开机并且联网的状态下就会跟苹果的服务器(APNs)建立长连接,QQ启动后调用APNs的API,生成一个deviceToken,deviceToken内包含两个参数:即设备的唯一标识(UDID)和应用程序的唯一标识(Bundle ID)。这里为什么要调用APNs的API呢?因为deviceToken内含有UDID,这个设备唯一标识是属于隐私数据,苹果不可能随便就让一个应用获取到设备的唯一标识,所以就需要调用APNs的API来生成deviceToken,这个deviceToken是经过APNs加密后生成的,生成后APNs保存一份,再把deviceToken发送给客户端的QQ。

2、QQ接收到deviceToken后,把这个deviceToken外加上用户的唯一标识(如QQ为:123)和设备类型(iOS或安卓)发送给QQ的服务器,最少需要这两个参数,为什么发送设备类型后边会有解释。QQ服务器就会在服务器端建立一个数据表,存储这些信息。

3、当QQ为456的用户给QQ为123的用户发送消息的时候,消息内包含要发送到的目标(即123)和消息内容(最少这两个参数),消息到达QQ的服务器后,服务器会从数据库内先查找用户目标(123),找到后提取出deviceToken,把deviceToken连同消息内容发送给APNs,APNs把deviceToken进行解析,前面说到deviceToken是APNs给加密的,这个加密说白了只有.h没有.m,并且是闭源的,所以只有APNs自己知道如何去解析这个deviceToken。解析后通过deviceToken内的UDID找到设备,然后通过Bundle ID找到应用(即QQ),然后调用QQ的方法把数据解析然后展示给用户。

以上就是远程推送的整个流程。

下面说一说一些实际应用中会遇到的问题:
1、换号(即退出登录换另一个账号):前面提到QQ会把用户的唯一标识(QQ号)发送给QQ的服务器,如果一台设备重新登录账号,同样会发送deviceToken和QQ号给QQ的服务器,服务器做对比后发现这个deviceToken之前有一个账号用过,会把这个deviceToken存入新登录的账号的数据表中并且删除这个deviceToken之前绑定的QQ号,这个问题就解决了。

2、换手机:同一个用户,在另一台设备上登录了,同样会把这台手机的deviceToken发送给QQ服务器,然后在数据库中更新deviceToken就可以了!这里还有另一种情况,就是用户从iOS端登录后退出账号,然后从非iOS端登录(如安卓手机登录),这里就用到了最开始上传给QQ服务器的设备类型了!QQ服务器会判断你的设备类型,如果是iOS端直接告诉APNs给用户推送就行了,如果不是iOS端,那QQ的服务器就不会给APNs发请求,就这么直接。

3、同步更新本地和服务器的图标文字,就是app图标右上角的小红点,这个看需求,从服务器获取数据给属性设值就行了。

大概也就这么多,如果有什么遗漏的地方,请留言给我,欢迎各位发表自己的看法和见解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值