【发布时间】:2014-04-23 14:23:50
【问题描述】:
各位,我最近尝试使用 nodejs 作为第 3 方 APN 服务器,我正在使用 node-apn 模块 (https://github.com/argon/node-apn)。当我在短时间内推送相同的通知(我的意思是相同的警报)时(例如 5 分钟内的 5 个通知),我发现 Apple 的 APN 服务器似乎“缓存”了我的通知,之后,当我正常推送另一条消息(以正常速率,比如一条消息 5 分钟),“缓存”的消息会一次又一次地到达我的设备。
我对 node-apn 模块的代码进行了一些研究,发现它为苹果创建了一个 TLS(SSL),并将一个流数据(在 nodejs 中是一个缓冲区)发送到苹果的服务器,一切似乎可以,但是消息只是重复的(当我在短时间内推送它们时)。我还尝试了 Python 的 lib APNSWrapper(https://code.google.com/p/apns-python-wrapper)。代码只是做同样的事情,不会出现问题。
他们发送到苹果服务器的内容是一样的,包括:
[command, token.length, token.content, payload.length, payload.content]
command、token.length 和 payload.length 是big-endian 中的双字节无符号整数。 python lib用!HB32s58s格式构造整个流,32和58只是长度。 !表示大端,H 表示无符号字符(1 字节),B 表示无符号整数(2 字节)。 32s 表示 32 字节的字符串,58 表示 58 字节的字符串。
而nodejs tls连接也只是做同样的事情,所有的长度都是用cleartextStream.writeUInt16BE()写的,这里的BE就是big-endian。
我已经逐字节测试了它们发送的内容是一样的。我什至创建了一个 SSL 服务器来接收他们的消息,并且我收到了相同的数据(也逐字节检查)。所以苹果服务器收到的应该是完全一样的。但他们只是有不同的行为。我在这里等待任何建议,提前谢谢!
【问题讨论】:
标签: python ios node.js ssl apn