小米手机。把APP切换到后台,一段时间后socket被自动关闭,但是APP并没有被关闭,直接从后台应用列表还是可以直接进入。但是websocket被关闭了。
怎么发现的呢,通过后端的在线client来判断的。
后端是可以发现,但是前端并没有触发websocket被关闭的事件,这个时候想到一个办法,就是通过心跳。
我通过设定一个心跳时间来判断链接是否被关闭,例如我设置一个定时器,每40秒像服务器发送一次心跳。在app.vue中的onShow方法中,我来判断这个间隔事件是否超过了50秒,超过了50秒就99.99%是被关闭了,那么我再重连一下socket不就行了
这个时候问题来了,我再次重连websocket,
let time = Math.round(new Date() / 1000)
if ((time - this.socketPongTime) < 50) {
// console.log("socket已经开启");
setTimeout(() => {
uni.showToast({
title: "已经链接",
icon: "none"
})
}, 0)
return;
} else {
setTimeout(() => {
uni.showToast({
title: "准备开启",
icon: "none"
})
}, 0)
uni.connectSocket({
url: this.websocketUrl,
})
}
看方法,这样来通过心跳时间来判断是否被关闭了,超过50秒就重新
uni.connectSocket({
url: this.websocketUrl,
})
此时,在后端的cilent_id已经有重新连接上的设备了,但是不触发任何回调了。
uni.onSocketOpen(() => {
this.socketPongTime = 0
setTimeout(() => {
uni.showToast({
title: "开启socket成功"
})
}, 1000)
clearInterval(this.socketTimeTick)
})
uni.onSocketError((res) => {
console.log('WebSocket连接打开失败,请检查!');
this.socketPongTime = 0
clearInterval(this.socketTimeTick)
uni.closeSocket()
});
uni.onSocketClose((res) => {
console.log('WebSocket连接被关闭,请检查!');
this.socketPongTime = 0
clearInterval(this.socketTimeTick)
})
这些回调都不触发了,而且onSocketMessage的回调也不触发了。
uni.onSocketMessage((res) => {
let ret = JSON.parse(res.data)
setTimeout(() => {
uni.showToast({
title: "接收到消息" + ret.type,
icon: "none"
})
}, 2000)
}
测试了同事的华为手机,被后台杀掉后再进入正常重连而且正常触发回调
就是小米手机不行,能重连,但是不触发任何回调
其他手机没测试过 红米note9 4g miui12.0.12 安卓版本10
1***@qq.com
同样的情况 大佬有解决办法了吗
2023-08-11 09:54