中国特色之APNs connection reset

最近在捣鼓 iPhone Push Notification

基本上就是TLS连一下APNs,但是鉴于TLS连接会受到随机阻断(goo.gl/KCMR8),消息将很难确保一定成功发送。

当APNs收到一条它认为有误的信息时就会立即断开连接,并且放弃后续的所有消息,同时会返回一条消息告诉Povider哪条消息有误。因此我们需要有一个错误恢复机制。

但是在一个TLS连接随时可能被切断的情况下,我们还需要不断恢复TLS连接。如果这时恰好有错误发生,那么我们将无法从APNs获取错误信息,因此也无法进行错误恢复,一部分消息将丢失。实际测试中差不多发送几十到几百条消息时,就会被reset一次,频率还是很高的。

有趣的是我将代码部署到海外服务器的时候,完全没有影响,消息发送速度也要高很多。

解决办法?

如果有条件的话,使用海外服务器来进行你的消息推送, Amazon EC2就是一个不错的选择。结合ssh -D -N,你懂的。

如果没有条件,那么我建议将发送窗口调小点,比如发送100条消息就关闭当前连接,重新与APNs建立连接。这样消息丢失的损失就可以控制在100条以内。当然这么做苹果会很不高兴,苹果官方推荐在一个链接里面尽可能多发送消息以节省资源。

 

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>