0

伙计们,我最近尝试使用 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 是双字节 unsigned int in big-endian。python lib用格式构造整个流!HB32s58s,32和58只是长度。!表示大端,H 表示无符号字符(1 字节),B 表示无符号整数(2 字节)。32s 表示一个 32 字节的字符串,58 表示一个 58 字节的字符串。

而nodejs tls 连接也只是做同样的事情,所有的长度都是用 写的cleartextStream.writeUInt16BE(),这里的 BE 表示 big-endian。

我已经逐字节测试了它们发送的内容是一样的。我什至创建了一个 SSL 服务器来接收他们的消息,并且我收到了相同的数据(也逐字节检查)。所以苹果服务器收到的应该是完全一样的。但他们只是有不同的行为。我在这里等待任何建议,提前谢谢!

4

1 回答 1

0

为确保您不会传输两次,请尝试以下操作:

apnConnection.on('transmitted', function(notification, device) {
  console.log("Notification transmitted to:" + device.token.toString('hex'));
});
于 2014-10-29T08:54:06.077 回答