蛋疼的Apple IOS Push通知协议

简介

Apple Push通知机制其实很简单,就是Apple的APNs服务器做为中间人,把消息推送到对应的设备上。

一张来自Apple文档的图:

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

比如,如何区分Provicer的?如何区分设备的?

简单而言,是这样的:

  • 每个应用都有一个自己的证书(certificate),开发者可以从苹果那里获得;
  • 应用可以到APNs服务器上注册(register),然后得到一个device_token,开发者要自己保存好,推送时就要用这个来区分不同的设备。
  • 注意,token并不是设备唯一标识码。token是可以改变的,因此APNs提供了一个feedback服务,开发者可以得到失效的token。
  • 对于每个设备只存储最后的一条push,所以如果连续发很多条push,设备没有及时接收的话,后面的push会覆盖前面的。
  • Provider和APNs服务器,APNs服务器和用户设备之间的通迅都是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。

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

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

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

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

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

好吧,也许你会说4096个消息体比较大小,Apple的服务器的TCP socket缓冲区都满了,你发不了这么多的消息。

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

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

开发者测试用的沙箱服务器是个摆设

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

但是你的设备却是收不到消息的。要是在实现自己的客户端时,用这个来测试,就蛋疼了,一次次检查自己的代码,看是否有问题,最终却发现是对方的服务器有问题。。

只有程序员才能明白这种蛋疼的心情。

不支持分组发送

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

可能还有一些蛋疼的地方,忘记了,下篇blog说下一些实现自己的客户端要注意的事项及一个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通知协议

时间: 2024-10-13 22:24:30

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

【iOS】push通知(JavaEE实现)

第一次做iOS push,回想起来还挺简单的.因为做的时候没留下图,所以就不上图了 去http://developer.apple.com ,用付过费的开发者帐号,创建一个新的应用.勾选上Enable Push Notification;然后在本机的Key Chain 中请求从证书颁发机构请求一个证书. 上传, 下载这一套流程我就不说,网上很多 主要介绍一下psuh的详细过程 证书什么的, 客户端,我都已经配置好了.可服务端的人没做过这个.没办法,我来封装一下服务端的代码吧. 我选择了Java

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

这是一篇来自raywenderlich的教程,内容翔实!结构简单透彻.讲解循序渐进.文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下: 1.[iOS push全方位解析](一) push的概述 2.[iOS push全方位解析](二) 生成push证书,生成Provisioning Profile(本篇) 3.[iOS push全方位解析](三) 一个极简的demo,并测试一下push 这里查看原文 ------------------------------------------

Apple推送通知服务教程

Apple推送通知服务教程 生成APP ID和SSL证书 登录iOS Provisioning Portal页面 首先,我们将要新建一个App ID. 每一个推送APP都需要一个唯一的对应的App ID,推送的消息将被送达到这个ID对应的APP应用中(这里不能使用通配ID). 在iOS Provisioning Portal页面左侧选择 App IDs,然后点击 New App ID 的按钮. 在例子中,对应的表单项填的值如下: · Description: PushChat · Bundle

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

这是一篇来自raywenderlich的教程,内容翔实!结构简单透彻.讲解循序渐进.文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下:1.[iOS push全方位解析](一) push的概述2.[iOS push全方位解析](二) 生成push证书,生成Provisioning Profile(本篇)3.[iOS push全方位解析](三) 一个极简的demo,并测试一下push 这里查看原文 ---------------------------------------------

IOS PUSH 实践操作~~~~

1.推送过程简介 (1)App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请.若注册成功,回调函数application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 会被触发,App可以得到deviceToken,该tok

"iOS push全方位解析(一)【译文】"——iOS PUSH概述

这是一篇来自raywenderlich的教程,内容翔实!结构简单.讲解循序渐进.文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下: 1. push的概述(本博文) 2. 生成push证书,生成Provisioning Profile 3. 一个极简的demo,并测试一下push 这里查看原文 -------------------------------------------------------------------------------------------------

"iOS push全方位解析(三)【译文】"——一个极简的demo,并测试一下push

这是一篇来自raywenderlich的教程,内容翔实!结构简单透彻.讲解循序渐进.文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下: 1. push的概述 2. 生成push证书,生成Provisioning Profile 3. 一个极简的demo,并测试一下push.(本博文) 这里查看原文 一个极简的demo 到目前为止,上面还不是做的还不够让人兴奋,但是那些准备工作还是很有必要的.本教程像你详细展示了如何生成证书,因为每天都会用到证书,而且没有证书push就不好.刚才你刚搞

[转]ios push

转:http://blog.csdn.net/showhilllee/article/details/8631734 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器. 上图可以分为三个阶段: 第一阶段:应用程序的服务器端把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Pus

IOS PUSH

第一阶段:.net应用程序把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone. 第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知. 从上图我们可以看到. 1.首先是应用程序注册消息推送. 2. IOS跟APNS Server要deviceToken.应用程序接受deviceToken. 3.应用程序将deviceToken发送给P