远程推送
就是从远程 server 推送消息给 client 的通知。当然须要联网。
远程推送服务 APNs (Apple Push NotificationServices)
为什么须要远程推送通知?
传统获取数据的局限性是仅仅要用户关闭了 app。就无法跟 app 的 server 沟通。无法从 server 上获得最新的数据内容
而远程推送通知能够解决问题,无论用户打开还是关闭 app,仅仅要联网了,都能接收到 server 推送的远程通知。
我们先从网络连接開始了解下。
http 协议:是个短连接,一个请求一个响应就结束了。
典型的网络请求。
tcp/ip 协议:三次握手连接,仅仅要 server 或者 client 不主动断开。保持连接着。大概 QQ 聊天就是这样的协议了。
推送,我们从 QQ 聊天着手吧。
A 用户和 B 用户聊天:
1.A 和 B 用户同一时候在线,跟 server 保持连接状态下:"A 发送消息给 B:在吗?,B 回复:在的。" 我们分析下这个过程。
->A 将消息 "在吗?" 发送给 QQserver,此时由于 B 与 server 也保持连接,因此 server 将消息发送给 B,相同 B 的回复也反向传输成立。
2.A 发送消息给 B。但 B 不在线。
-> 这样的情况下,server 无法将 A 的消息发送给 B 了。那我们手机不在线的情况下是怎么收到 A 的消息的?
那我们就不得不拿出来神器远程推送了。远程推送是通过苹果的 APNsserver 来实现的。仅仅要你的苹果设备联网状态,你的设备就与苹果的 APNsserver 保持一个长连接状态。
那我们就能够想到。A 将消息发送给 server 时,server 将消息发送给 APNsserver 的方式能够实现将消息发送给 B 了,那详细是怎么实现的呢?我们往下看:
1. A 与 B 安装 QQclient。登录自己的 QQ 号码时。A 和 B 将自己的 QQ 号码 + 苹果设备的 DeviceToken 发送给 QQserver,QQserver 将这一组数据保存在自己的数据库中。
获取 DeviceToken 方法。在 AppDelegate.m 中:
- - (void) application: (UIApplication * ) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData * ) deviceToken {}
2.A 将消息 "在吗?" 发送给 B 时,server 发现 B 不在线,这时,server 从数据库中查找 B 相应的 DeviceToken, 将 B 的 DeviceToken + 消息 "在吗?" 发送给 APNsserver。
3.APNsserver 收到消息后,找到 B 相应的 DeviceToken, 将消息 "在吗?" 发送给 B 的设备。
那么另一个疑问。APNsserver 将消息发送给 B 的设备。那怎么知道是 QQclient 呢?
事实上说白了。这个事情就被 DeviceToken 包括了,当你获取 DeviceToken 时,苹果偷偷的将设备的 UDID 和 APP 和 bundle identifier 发送给苹果 server。苹果 server 返回给你了 DeviceToken。因此 QQserver 将消息 + B 的 DeviceToken 发送给苹果的 APNsserver 时,苹果已经知道了是哪个 client 了。
----end
来源: http://www.bubuko.com/infodetail-2218045.html