最近在捣鼓 iPhone Push Notification
基本上就是TLS连一下APNs,但是鉴于TLS连接会受到随机阻断(goo.gl/KCMR8),消息将很难确保一定成功发送。
当APNs收到一条它认为有误的信息时就会立即断开连接,并且放弃后续的所有消息,同时会返回一条消息告诉Povider哪条消息有误。因此我们需要有一个错误恢复机制。
但是在一个TLS连接随时可能被切断的情况下,我们还需要不断恢复TLS连接。如果这时恰好有错误发生,那么我们将无法从APNs获取错误信息,因此也无法进行错误恢复,一部分消息将丢失。实际测试中差不多发送几十到几百条消息时,就会被reset一次,频率还是很高的。
有趣的是我将代码部署到海外服务器的时候,完全没有影响,消息发送速度也要高很多。
解决办法?
如果有条件的话,使用海外服务器来进行你的消息推送, Amazon EC2就是一个不错的选择。结合ssh -D -N,你懂的。
如果没有条件,那么我建议将发送窗口调小点,比如发送100条消息就关闭当前连接,重新与APNs建立连接。这样消息丢失的损失就可以控制在100条以内。当然这么做苹果会很不高兴,苹果官方推荐在一个链接里面尽可能多发送消息以节省资源。