筷子
筷子
  • 发布:2021-09-07 17:25
  • 更新:2021-09-07 17:29
  • 阅读:724

安卓端,无法监听到socket的回调

分类:uni-app

小米手机。把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

2021-09-07 17:25 负责人:无 分享
已邀请:
筷子

筷子 (作者) - 90后

看,实际上opensocket是连上了的,连上后后端会向前端发送一个init消息,让前端发送用户的id和token进行账号绑定

绑定成功后就代表业务逻辑正常了,不用再去重连了,但是就是因为onMessage 和onOpen 和其他回调都监听不到,导致不能正常绑定,然后前端就无限重连了。

  • 1***@qq.com

    同样的情况 大佬有解决办法了吗

    2023-08-11 09:54

该问题目前已经被锁定, 无法添加新回复