手机锁屏以及退出后台webscoket会断开,js在手机熄屏后会中断,在唤醒之后js会继续执行。所以设置在js中的定时发送心跳包的功能在手机熄屏后就没法执行了。熄屏时间过长,这个时候链接就会被服务端强制断开,并且大部分手机在熄屏时,websocket连接就已经断开了。
解决办法: 使用H5提供的页面隐藏/显示API。
document.addEventListener('visibilitychange', function () { if (document.visibilityState == 'hidden') { //记录页面隐藏时间 let hiddenTime = new Date().getTime() } else { let visibleTime = new Date().getTime(); //页面再次可见的时间-隐藏时间>10S,重连 if ((visibleTime - hiddenTime) / 1000 > 10) { // 主动关闭连接 WebSockets.webSocketClose(); // 1.5S后重连 因为断开需要时间,防止连接早已关闭了 setTimeout(function () { WebSockets.openSocket() }, 1500); } else { console.log('还没有到断开的时间') } } }