伙计们,我最近尝试将nodejs用作第三方APN服务器,并且我正在使用node-apn模块(https://github.com/argon/node-apn)。当我在短时间内推送相同的通知(我的意思是相同的提醒)(比如5分钟内的5次通知)时,我发现似乎Apple的APN服务器已缓存&#39 ;我的通知,在那之后,当我正常推送另一条消息时(以正常速率,例如5分钟的消息),“缓存”#39;消息会一次又一次地传到我的设备上。
我对node-apn模块的代码进行了一些挖掘,发现它为apple创建了一个TLS(SSL),并发送了一个流数据(在nodejs中是一个Buffer)对于苹果公司的服务器来说,一切似乎都没问题,但这些消息只是重复的(当我在短时间内推送它们时)。我还在Python的lib APNSWrapper(https://code.google.com/p/apns-python-wrapper)上再试一次。代码只是做同样的事情,问题不会出现。
他们发送给苹果服务器的内容是相同的,包括:
[command, token.length, token.content, payload.length, payload.content]
命令,token.length和payload.length是big-endian
中的双字节unsigned int。 python lib使用格式!HB32s58s
构造整个流,32和58只是长度。 !表示big-endian,H表示无符号字符(1字节),B表示无符号整数(2字节)。 32s表示32字节的字符串,58表示58字节的字符串。
并且nodejs tls连接正在做同样的事情,所有长度都用cleartextStream.writeUInt16BE()
写,BE在这里意味着大端。
我已经逐字节地测试了它们发送的内容是否相同。我甚至创建了一个SSL服务器来接收它们的消息,我收到了相同的数据(也是逐字节检查的)。那么苹果公司的服务器收到的应该是完全一样的。但他们只是有不同的行为。我在这里等待任何建议,提前谢谢!
答案 0 :(得分:0)
为确保您不进行两次传输,请尝试以下操作:
apnConnection.on('transmitted', function(notification, device) {
console.log("Notification transmitted to:" + device.token.toString('hex'));
});