关于Push的问题时, 由于最近在研究iOS开发, 详细阅读了苹果官方的开发文档, 觉得有把握把这个问题说说清楚.

 


首先说, 何为Push?

拿起你的爱机, 打开"设置", 你会看到有一项叫做"通知".
为什么这里不叫推送呢? 因为推送(Push)的全称叫"推送通知(Push Notifications)", 对应的还有另一种通知叫"本地通知(Local Notifications)".
二者的区别就在于推送通知来自于互联网, 是走流量的, 而本地通知只是由后台运行的程序发起, 由系统代为显示而已, 不涉及到网络.

hiphotos.baidu.com.jpg

 


Push消息是怎么来的?

当你的手机开机并且联网以后, 手机会把自己的唯一标识(就像×××号)发送给苹果服务器, 验证成功后, 苹果服务器会把你的标识加密, 生成另一个用来识别推送对象的标识, 然后双方会保持连接, 但是只传少量信号用来验证你还在线. 有多少信号要传呢? 打个比方, 差不多每次传一个标点符号那么少, 只是为了验证你没有关机.
很多人会说Push比较费电, 这个见仁见智了. 不过理论上说不会费多少电的, 而且这也是目前比较先进的实时推送解决方案了.

hiphotos.baidu.com_1.jpg

 


为什么要绕弯子从苹果服务器走?

处于后台运行中的程序是禁止访问网络的, 例如QQPush消息, 是从QQ的服务器发往苹果服务器, 再转发给你的手机, 最后由手机上的系统统一接收, 再转给后台运行中的QQ程序, QQ程序接到数据后决定以什么样的方式显示在对话框上.
这样做的好处是, 所有的Push最终只依靠一条网络连接, 这样即可以对流量有效控制, 也能节省资源, 试想一下要是谁都能在后台访问网络, 自己去更新自己的数据, 那不是乱了套了吗?

hiphotos.baidu.com_2.jpg


为什么Push过来的QQ消息有时候会显示不全?

苹果规定每条Push消息都不能超过256字节(The maximum size allowed for a notification payload is 256 bytes), 超过这一限制的消息会被拒绝. 256字节是多长呢? 你可以理解为256个数字或字母那么长.
这不只是对文字内容的限制, 而是对整个数据包的限制, 例如QQ要想弄清楚Push过来的消息是什么, 起码得知道对方的QQ, 这些都算在256字节之内, 也就是说Push消息内容实际能使用的字数更少, 外加汉字还要减半(一个汉字顶两个英文字母).
另一方面软件作者也要考量屏幕尺寸能容纳的字数, 太大了也会影响美观.

hiphotos.baidu.com_3.jpg

Push会带来泄露隐私吗?

简单的说, 不会.
正如前面那边表示登录苹果服务器步骤的图片, 你的手机向苹果服务器提交手机标识是使用的SSL安全连接, SSL安全连接就是... 就是很牛X的东西, 只有你们两个人看得见.
苹果服务器验证你的手机后会把标识加密起来, 最终软件得到的是加密结果.
还记得当初黑雨越狱美版iPhone那个时代了吗? 许多人打开Push后接收到的却是别人的QQ消息, 就是因为为了越狱的需要, 你的手机标识为修改成同一个了, 所以大家登录苹果服务器后被苹果当成同一个人, 消息自然也就乱了套了.
因此说, 那些软件作者记录并且上传未加密的手机标识的人是不道德的, Push并不是这种不道德行为的理由.