我们知道历代iPhone手机出现问题最多的一个就是通知延迟、无提醒,实际上,这个问题不管你是什么型号,几代的iOS系统都会出现这个问题,很多人会问,这个问题出现了这么久,难道苹果不知道么?实际上不是不知道,而无能为力。

说到苹果系统的通知,我们就要知道苹果系统的推送原理

首先苹果系统的通知是由苹果的APNs(苹果推送服务器)统一推送到我们手机的,也就是我们发送的消息必须经过app厂商服务器,然后app厂商服务器将消息转发到APNs服务器,APNs服务器在发送到我们手机上指定的app,最后经过iOS系统处理弹出提示框,原理图如下:

推送示意图

首先我们要知道消息的及时推送大多是建立在TCP/ip协议连接的,就像上图的箭头就可以看作一条TCP连接的,任何一条断开,都将无法收到通知推送。

我们使用的微信也会经常出现延迟,在张小龙的采访记录里曾经说过,他是不想做iPad版的微信的,如下图

张小龙采访记录

问题出现的原因:

我们现在所使用的宽带,大多数都是被运营商分配的私网IP,私网IP不同于公网IP。公网IP直接可以访问公网,网络是非常通顺的,但是单独内网是无法使用的,需要连接到公网才能使用,,我们的消息延迟就出现在私网与公网之间的连接,由于IP和端口数量有限,而我们用户的需求是无限的,这就导致我们所使用的私网IP和端口在使用一段时间之后是需要被回收的,回收时间是运营商规定的,和手机系统无关,大多数都会在两三分钟之内会被回收,有的甚至更短,这就导致我们推送所需要的TCP连接会在一段时间内自动断开,而且在检测到没有数据流通的时候会立即断开,这就是消息不通知的原因,延迟是因为我们消息已经发送,但是TCP已经断开,消息无法发送,但是过一会连接,堆积的消息重新发送,这就是我们看到的消息是好几分钟之前的消息的原因。

有很多伙伴消息延迟的时间不一样,有的五分钟,有的甚至达到了一个小时,那是因为延迟一个小时的小伙伴已经处于内网中的内网,延迟是非常恐怖的,可以这么理解,一个灯泡之间串联了许多的开关,必须所有的开关都要闭合,灯才会亮,延迟严重的=小伙伴就是因为“开关”串联的非常多,延迟小的小伙伴就是“开关”串联的少的原因。

这里的“开关”就是NAT超时。

如何解决

首先要明确一点的是不要相信任何设置就能解决这个问题的,手机上的任何设置都是没有作用的,不管是重启,卸载重装都是没有作用的!千万不要相信!

我们能做的只有以下两点:

  1. 跟运营商索要公网IP,这一点在移动可能很难实现,毕竟移动是租用的电信的主干网络,索要公网IP是要收费的,该公网IP能解决很好理解,就是内网到私网之间存在一个”开关“了,这个超时时间可以忽略不计,也就不会出现消息延迟了,这个办法是百分比可以解决问题的,
  2. 将路由器桥接,这么做的目的也是为了减少私网到公网之间的“开关”,但是只能是尽量减少,不会向公网那样只有一个”开关“能达到公网IP80% 的效果。索要不到公网IP的小伙伴可以尝试这个办法。

总结:消息延迟是由于内网与外网直接的”开关“过多,导致TCP连接性频繁断开,从而导致消息不通知、延迟等问题,我们能做的只能是索要公网IP和将路由器桥接,尽量减少中间设备的转发从而解决推送延迟等问题

其次,我对消息延迟的说明已经是非常简略了,里面要说的东西实在是太多了,我把主要原因和解决办法给大家说一下就好了,还有就是国内网络实际上是非常的复杂的,大多数可能只是看看视频,聊聊微信是感觉不出的,不然也就不会有内网穿透技术的产生了