this ._socketTask = wx.connectSocket({ url: option.url, header: { ...option.header, 'content-type' : 'application/json' }, method: 'GET' , fail: function (res){ self._isLogin = false self.reConnect() } }) } |
sendHeartBreakMsg() { let self = this
self._socketTask.send({ data: 'HB_' +wx.getStorageSync( 'loginInfo' ).token, success: (e) => { // console.log('HB') }, fail: (res) => { console.log(res, self._socketTask, self._options, self._socketTask.readyState) if (self._socketTask && self._socketTask.readyState != 1) { self.reConnect() } else if (!self._socketTask) { self.createConnection() } } }) } catch (e){ console.log(e) } } |
错误日志已上传2019-05-21
正常connectSocket创建连接,测试使用两种方法发送message:sendSocketMessage / socketTask.send 发送。 一切在3-5分钟内是好的。切到后台,回到微信连天页面,再切回小程序,消息还是正常发送。操作3-5分钟后,发送消息就会报 sendSocketMessage: fail 。taskID not exist。此时websocket是连通的,readystate是open状态。我就想问一下这个报错是什么意思?导致sendSocketMessage一直报错。只有关闭微信重开才可以解决。kill吊销程序重启才能解决。 手机:iphoneXr IOS 12.2
基础库版本:2.7.0
同样遇到,表现是成功链接以后,如果遇到断网。
第一个是 Ios会同时触发onClose和onError,安卓则只触发onClose
第二个是 进行重连的时候,安卓端表现正常,旧的websoket会被清除,而Ios则不会,Ios只会显示「taskId not exist」
第三个是 进行重连的时候,如果还是没有网络,安卓端只会触发onError,而Ios则会触发onClose和onError…
导致Ios端无限触发onClose,指数增长,创建无数实例
很明显就是两端表现不同步,Ios端逻辑有错误,或者安卓端没完整
解决办法是
第一个是,限制重连次数,避免无限创建实例
第二个是,加上链接成功的标识,保证链接成功后,onClose的只会触发一次
这个巨坑,其实是这样的,小程序websocket在连接超时或者网络切换(4g切换3g,3g切换2g)的时候,webscokt的回调函数存在异常。测试下来发现小程序websocket会先走onerror回调,wss协议这时候会关闭该连接,导致taskID已经被清空,但是后面又回回调onopen这个生命周期,此时readystate变为1。解决方案目前想到的就是强制重连,也希望微信官方能早日修复该bug