简单介绍

Apple Push通知机制事实上非常easy,就是Apple的APNsserver做为中间人,把消息推送到相应的设备上。

一张来自Apple文档的图:

当然,示意图看起来简单,可是另一些实际的问题。

比方,怎样区分Provicer的?怎样区分设备的?

简单而言,是这种:

  • 每一个应用都有一个自己的证书(certificate),开发人员能够从苹果那里获得;
  • 应用能够到APNsserver上注冊(register),然后得到一个device_token,开发人员要自己保存好,推送时就要用这个来区分不同的设备。
  • 注意,token并非设备唯一标识码。token是能够改变的,因此APNs提供了一个feedback服务,开发人员能够得到失效的token。
  • 对于每一个设备仅仅存储最后的一条push,所以假设连续发非常多条push,设备没有及时接收的话,后面的push会覆盖前面的。
  • Provider和APNsserver,APNsserver和用户设备之间的通迅都是SSL/TLS协议的。这点要比国内的推送服务商要做的好,国内的推送服务都是http接口的,全然没有加密。
  • Push都是对于设备而言的。所以敏感信息不要通过push来传递。
  • Push是尽量送达的,Push消息可能会丢失,所以不要用Push来传递可靠数据。

Apple Push的协议蛋疼之处

上面仅仅是有一些要注意的小地方,以下来说下真正蛋疼的东西:Apple Push的协议。

首先,明显的是设计不良:

协议里的command,如今实际上也用来表示Version。

比方command = 0, 1, 2就分别表示发送消息的三个版本号。

更蛋疼的是前面0,1两个版本号如今的文档都找不到了。这个让维护老代码的人情何以堪?想调试下bug,结果发现官方文档都消失了,那得多蛋疼。

Apple的文档里仅仅说到:

Field name

Length

Discussion

Command

1 byte

Populate with the number 2.

可能在你看这篇文章的时候,变成了“Populate with the number 3”了。。

正常人看到这里仅仅会认为一头雾水,为什么这个command是2?怎么想得到这个Command竟然是和版本号相关的。。我是从别的一些实现代码里才知道有三个版本号的。

协议格式混乱

比方这个feedback的格式:

deviceToken就是固定好了是32字节的,前面还要加一个Token length。

有人可能说,这是考虑了以后token大于32字节的。那干脆应该为feedback的回应包加上版本。

发送者能够批量发送消息,可是仅仅有出错的时候才会返回出错消息的ID。

这个乍看起来,没什么问题。可是当你想要实现一个Pushclient的时候,就知道蛋疼之处了:

发送者连续发了1,2,3,4 ... 100 条消息,已经写到socket里去了,这里APNsserver回应说第57条消息失败了。

那发送者得从第58条開始,又一次再发。那发送者得把前面已经发送出去了的消息缓存起来!

好的,缓存一下也没关系,那么究竟缓存多少个消息呢?1024个?2048个?天知道。

要是发送者的网速快,一下子把4096个消息都发出去了呢?那怎么办?

好吧,或许你会说4096个消息体比較大小,Apple的server的TCP socket缓冲区都满了,你发不了这么多的消息。

我仅仅是想发个Push消息而已,难道还要推算APNsserver的socket缓冲区的大小?要是它的网络框架也做了缓冲呢?要是发送者的网络框架也做了缓冲呢?

是不是每次发送时,都要等待数据全都写到socket里去了?

开发人员測试用的沙箱server是个摆设

文档上写了在开发环境能够用这个域名,gateway.sandbox.push.apple.com。可是坑爹的是,这个域名实际上是个摆设,你能够建立SSL连接,也能够正常发送消息。

可是你的设备却是收不到消息的。要是在实现自己的client时,用这个来測试,就蛋疼了,一次次检查自己的代码,看是否有问题,终于却发现是对方的server有问题。。

仅仅有程序猿才干明确这样的蛋疼的心情。

不支持分组发送

如今的国内流行的推送服务,如百度推送等,都支持分组的配置,这样大大节省了带宽,提离了发送效率。

可能另一些蛋疼的地方,忘记了,下篇blog说下一些实现自己的client要注意的事项及一个Java的实现ZPush。

參考:

http://support.apple.com/kb/HT3576?viewlocale=zh_CN&locale=zh_CN

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW12

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1

蛋疼的Apple IOS Push通知协议的更多相关文章

  1. iOS - Push 通知推送

    1.UserNotifications 通知是 App 用来和用户交流的一种方式,特别是当 App 并没有在前台运行的时候.通知,正如它的名称所强调的,被用作向用户'通知'一个事件,或者仅仅向用户提示 ...

  2. 了解iOS消息推送一文就够:史上最全iOS Push技术详解

    本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...

  3. [转]ios push

    转:http://blog.csdn.net/showhilllee/article/details/8631734 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 P ...

  4. 苹果推送(APNs)ios push小结

    把app删除后就推送不成功了,可以看出deviceToken应该是设备+app来一起识别的,重新安装后仍然为同一个 简介 推送服务APNs(Apple Push Notification servic ...

  5. Apple Remote Push Notifications

    1.帮助文档参考: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/Remote ...

  6. IOS PUSH 实践操作~~~~

    1.推送过程简介        (1)App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远 ...

  7. iOS push全方位解析(二)【译文】"——生成OpenSSL证书,Provisioning Profile

    这是一篇来自raywenderlich的教程,内容翔实!结构简单透彻.讲解循序渐进.文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下: 1.[iOS push全方位解析](一) push的 ...

  8. iOS Push详述,了解一下?

    WeTest 导读 本文主要对iOS Push的在线push.本地push及离线(远程)push进行梳理,介绍了相关逻辑,测试时要注意的要点以及相关工具.小小的Push背后蕴藏着大大的逻辑! Push ...

  9. Apple iOS MDM service 简介

    Apple iOS MDM service 簡介 藉由MDM服務,企業可以用來控管配發給員工的iOS Device.可以採用Apple官方推出的工具,也可以採用第三方開發的服務. MDM server ...

随机推荐

  1. STL之queue(单向队列)

    单向队列中的数据是先进先出(First In First Out,FIFO).单向队列一共6个常用函数(front().back().push().pop().empty().size()) #inc ...

  2. [LeetCode]题解(python):018-4Sum

    题目来源: https://leetcode.com/problems/4sum/ 题意分析: 这道题目和3Sum的题目类似,找出所有的4个数,使得这4个数等于target. 题目思路: 这道题做法和 ...

  3. C++ ABI之名字改变,编译器生成符号研究(以Qt为例)

    在C++中,由于重载等技术的存在,编译器要将函数.结构体.类等等的信息传递给链接器,就不能像C语言那样简单地通过函数名来完成,它需要提供额外的参数信息,而还要和C语言共用链接器,这就需要用到名字改编( ...

  4. [WPF疑难]Hide me! not close

    原文 [WPF疑难]Hide me! not close [WPF疑难]Hide me! not close                               周银辉 有朋友遇到这样的一个问 ...

  5. 基于visual Studio2013解决C语言竞赛题之0203格式化输出

     题目 解决代码及点评 #include <stdio.h> #include <stdlib.h> void main() { // print是输出函数,参数%s表示输 ...

  6. vc 国际化的资源文件处理

    MS Windows操作系统是一个世界上广泛使用的操作系统,对于不同语种的国家MS Windows有相应语种的版本.在不同语种的Windows平台上应该运行相应语种的应用程序.也就是说程序的用户界面( ...

  7. CSS实现背景图尺寸不随浏览器大小而变化的两种方法

    一些网站的首页背景图尺寸不随浏览器缩放而变化,本例使用CSS 实现背景图尺寸不随浏览器缩放而变化,方法一. 把图片作为background,方法二使用img标签.喜欢的朋友可以看看   一些网站的首页 ...

  8. ShareSDK for Android 只有新浪微博分享

    本文代码例子:http://pan.baidu.com/share/link?shareid=3710053477&uk=3189484501 ShareSDK 官方的例子非常好,但代码太多看 ...

  9. Windows 下统计行数的命令

    大家都知道在Linux下统计文本行数能够用wc -l 命令.比如: -bash-3.2$ cat pif_install.log | wc -l       712 但在Windows下怎样统计输出文 ...

  10. 静态化 - 伪静态技术(PHP正则表达式实现)

    效果: 代码: <?php // + —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— // + 正则表达式,实 ...