目录
1、背景
目前iOS已经有原生APNs推送服务,完全有苹果公司维护。对于我们来说,里面任何的操作就像个黑盒看不见摸不着,很多条件是无法控制的,比如高峰期推送消息不及时,到达率不能给出相关数据等。
2、设计流程图
思考主要问题:
1.长连通道的建立与初始化
长连通道的建立见下面。
长连建立成功后,第一次启动需要向服务端注册,获取服务端用于发push 推送的识别码,即push Token。
2.网络长连接通道的稳定性如何保证
(1) NAT超时断开长连通道的规避策略
由于网络运营商都有相应的NAT超时策略,如果客户端和服务端建立的连接在一定时间内没有数据交换,则会被判定为已废弃的连接,并将其关闭。为了避免这种情况影响Push 长连的存活,注册成功后,为了让TCP长连保持连接,需要使用闹钟模块Alarm Service定期向后台发送心跳。但如果发送太频繁,将会导致高额耗电量,所以心跳间隔时间应该由后端控制。
不同的网络运营商对于NAT超时的间隔有不同的设定,后端需要根据不同的网络类型,下发不同的心跳间隔,在最大程度上保证TCP长连存活的情况下,避免频繁心跳触发的高额耗电。
以下是不同运营商对于NAT超时时间的策略。
地区/网络 |
NAT超时时间 |
---|---|
中国移动3G和2G |
5分钟 |
中国联通2G |
5分钟 |
中国电信3G |
大于28分钟 |
美国3G |
大于28分钟 |
台湾3G |
大于28分钟 |
(2) DHCP 续租断开长连通道的规避策略
由于安卓系统对DHCP的处理存在漏洞—— DHCP租期到了不会主动续约并且会继续使用过期IP。
这个问题导致的问题表象是,在超过租期的某个时间点(没有规律)会导致IP过期,老的TCP连接不能正常收发数据。并且系