伙计们,我最近正在尝试使用nodejs作为第三方APN服务器,并且我正在使用node-apn模块(https://github.com/argon/node-apn)。当我在短时间内推送相同的通知(我的意思是,相同的警报)(比如5分钟内发送5个通知)时,我发现苹果的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]
命令、token.length和payload.length在big-endian中是双字节无符号整型。python lib使用!HB32s58s格式构造整个流,32和58只是长度。好了!表示big-endian,H表示无符号字符(1字节),B表示无符号整数(2字节)。32s表示32字节的字符串,58表示58字节的字符串。
nodejs tls连接也在做同样的事情,所有的长度都是用cleartextStream.writeUInt16BE()写的,这里的BE表示大端。
我一字节一字节地测试了它们发送的内容是一样的。我甚至创建了一个SSL服务器来接收他们的消息,并且我接收到了相同的数据(还逐个字节地进行了检查)。因此,苹果服务器收到的内容应该是完全相同的。但它们只是有不同的行为。我在这里等待任何建议,提前谢谢!
发布于 2014-10-29 16:54:06
要确保您不会传输两次,请尝试以下操作:
apnConnection.on('transmitted', function(notification, device) {
console.log("Notification transmitted to:" + device.token.toString('hex'));
});https://stackoverflow.com/questions/22470318
复制相似问题