供应商与苹果推送通知服务器的沟通
翻译:tangly
供应商与苹果推送信息服务器通信
http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1
普通供应商的需求
作为一个供应商与苹果推送通知服务的通信。这个接口对于程序供应商是高速的、大容量的接口;它使用一个流TCP插座设计结合二进制的内容。二进制接口是异步的。
生产环境的二进制接口可以通过gateway.push.apple.com端口2195来连接;沙箱(发展)环境的二进制接口可以通过gateway.sandbox.push.apple.com端口2195来连接。您可能会建立多个并行连接到相同的网关或多个网关的实例。
对于每一个接口可以你应该使用TLS(或SSL),以建立一个安全通信通道。这些连接所需的SSL证书通过IOS服务器分配。 (细节见“配置和发展”。)要建立一个值得信赖可以供应商的身份,在连接的时候,你应该使用此证书点对点的验证连接到APNS
注:建立一个TLS与APNS的会话,委托安全的CA根证书必须安装提供商的服务器上。如果服务器是运行Mac OS X,这根证书已经在钥匙串中了。在其他系统中,证书可能无法使用。你可以下载来自委托SSL证书的网站的证书。
你也应该保留与APNs连接的多个通知。APNs可能会考虑,迅速,并多次作为一个拒绝服务攻击可以建立和撕裂可以连接。错误时,APNS会关闭发生错误连接。
你作为一个供应商,应该以下几个方面的推送通知负责:
l 您必须构建有效的通知(见“有效通知”)。
l 你必须负责提供标志(badge)号在应用程序图标上显示(右上角)。
l 您应该定期与反馈Web服务器连接,并获取目前那些已经多次报道过失败的传输的设备列表(清单)。然后,你应该停止向这些应用程序相关联的设备发送通知。更多信息可以见“反馈”服务。
如果您打算支持多种语言的通知消息,但不使用客户端获取的本地化提醒字符串APS有效载荷字典LOC键和LOC - ARGS属性,你需要本地化警报消息可以文本服务器端。要做到这一点,你需要找出目前的客户端应用程序的语言偏好。 “调度,登记,处理通知”可以说明为获得这一信息的方法。 LOC键和LOC- args的属性信息可以请可以“通知有效载荷”。
二进制接口和通知格式
二进制接口采用的二进制内容的信息流在本质上是一个普通的TCP套接字。为了获得最佳性能,你应该在单一的传输接口通过分批传输多个通知,明示或使用一个TCP / IP Nagle算法。
该接口支持两种格式的通知数据包,简单的格式和增强的格式,以解决一些简单的格式的问题:
l 通知的有效期:APNS有一个存储并转发的功能,它可以保证最近的通知发送到装有应用程序的设备上。如果该设备是在接收通知时掉线,当该设备下次联网时,APNS会再次提供通知。简单的格式,不管通知是否是已经发送过针对性的通知。换句话说,该通知可以随着时间的推移变得“过时”。增强的格式包含着一个有限期值来表示通知有效期。当通知期限值到时,APNS会丢弃存储和转发器里的通知。
l 错误的反馈回应:简单的格式,如果你发送一个通知数据包,在某种方面是畸形的,例如,发送的内容超过规定的限制, APNS会响应切断连接,而且它不会给明拒绝通知的原因。增强的格式,让一个供应商用一个任意的标识符来标记通知。如果有一个错误,APNS会返回一个与该错误代码相关联的标示符。这种应答使供应商能够查找和纠正畸形的通知。
大多数供应商推荐使用增强的格式。
让我们研究简单的通知格式,首先是因为这种格式被增强格式所共享。图5-1说明了这种格式。
Figure 5-1 Simple notification format
图5-1 简单通知格式
简单的格式中的第一个字节是0(零)的命令值。设备令牌和发送消息的长度必须是在网络字节序(即大端法)。此外,您应该使用二进制格式对设备令牌进行编码。发送的消息内容不得超过256字节,不得是null结尾的。
清单5-1给出了一个函数使用简单的通知格式发送一个推送通知 到APNS上的二进制接口的例子。该示例假定SSL优先连接gateway.push.apple.com(或gateway.sandbox..push.apple.com)和对等交换认证。 请看官网代码
清单5-1使用简单格式发送通知到二进制接口
图5-2描述了通知数据包的增强格式。这种格式,如果APNS上的遇到无法理解的命令,它会在断开连接之前返回一个错误应答。
图5-2 增强通知格式
增强通知格式的第一个字节是为1的命令值。这种格式中的两个新字段是标识符和通知的有效期。(其它的都和简单的通知格式相同。)
l 标识符----一个任意值用来标识此通知。如果是APNS无法理解的通知,则返回一个错误应答包,包含此标示符。
l 有效期----一个固定的UNIX纪元日期(UTC)以秒为单位标识通知不再有效,并且可以被丢弃的时候。有效期值应该是网络顺序(大端法)。如果有效期值为正数,APNS至少试图提供一次通知。您可以指定零或一个小于零的值请求APNS不存储通知。
如果你发送的通知在APNS上发现通知格式不完整或其他无法解析的,它会在断开之前返回一个错误应答数据包。(如果没有错误,APNS不返回任何内容。)
图5-3给出了错误应答数据包的格式。
图5-3 错误应答数据包格式
该数据包包含一个值为8的命令值,紧跟一个字节的状态代码,和一个供应商指定的通知相同的标示符。表5-1列出了可能的状态代码及其含义。
Invalid :无效的
表5-1 错误应答的编码
状态代码 |
表示 |
0 |
No errors encountered |
1 |
Processing error |
2 |
Missing device token |
3 |
Missing topic |
4 |
Missing payload |
5 |
Invalid token size |
6 |
Invalid topic size |
7 |
Invalid payload size |
8 |
Invalid token |
255 |
None (unknown) |
清单5-2修改清单5-1的代码然后构成增强格式的推送通知将其发送到APNS。依然假定SSL优先连接gateway.push.apple.com(或gateway.sandbox..push.apple.com)和对等交换认证。
清单5-2使用增强格式发送通知到二进制接口
注意,生产环境的设备令牌和发展环境(沙箱)的设备令牌是不一样的值。
------
最后一句很重要啊。否则会出问题。
不过,我在苹果服务器反馈服务提到的只是普通的令牌而不是加强型的
上述原文:http://hi.baidu.com/tangly888/blog/item/183a0e88432eb7c8fc1f106b.html