uni-app websocket在ios端创建成功后onOpen事件不执行问题
uni-app websocket在ios端创建成功后onOpen事件不执行问题
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | win10 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:win10
HBuilderX类型:正式
HBuilderX版本号:3.2.2
手机系统:iOS
手机系统版本号:iOS 13.2
手机厂商:苹果
手机机型:iphonex、iphone11
页面类型:vue
打包方式:云端
示例代码:
const ws = uni.connectSocket({
url: url,
success: res => {
console.log('WebSocket创建成功', url, res)
uni.showModal({
title: 'WebSocket创建成功',
content: url,
showCancel: false
})
},
fail: err => {
console.log('WebSocket创建失败', url, err)
uni.showModal({
title: 'WebSocket创建失败',
content: url,
showCancel: false
})
}
})
ws.onOpen(function(res) {
console.log('WebSocket连接已打开')
uni.showModal({
title: '温馨提示',
content: 'WebSocket连接已打开',
showCancel: false
})
})
ws.onClose(function(res) {
console.log('WebSocket连接已关闭')
uni.showModal({
title: '温馨提示',
content: 'WebSocket连接已关闭',
showCancel: false
})
})
ws.onError(function(res) {
console.log('WebSocket连接错误', res)
uni.showModal({
title: '温馨提示',
content: 'WebSocket连接错误',
showCancel: false
})
})
setTimeout(() => {
uni.showModal({
title: '温馨提示',
content: 'readyState:' + ws.readyState,
showCancel: false
})
}, 5000)
操作步骤:
- 打包成app后iphoneX、iphone11机型大概率复现
预期结果:
- readyState的值为3后应该触发onClose或onError事件
实际结果:
- readyState的值为3后无任何反应
## bug描述:
uni-app打包成app后iphoneX、iphone11机型websocket大概率出现SocketTask.onOpen()回调事件不触发,同时SocketTask.onClose()、SocketTask.onError()也不触发,最后打印SocketTask.readyState的值为3。
更多关于uni-app websocket在ios端创建成功后onOpen事件不执行问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
9 回复
ws.onOpen 换成uni.onOpen试试
更多关于uni-app websocket在ios端创建成功后onOpen事件不执行问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
是uni.onSocketOpen吧,但是多个WebSocket要怎么区分
url发一下
我这边找的地址测试没问题,你看下是不是后端哪里配置问题
回复 DCloud_iOS_WZT: wss://precatsapi3.cats-trade.com:5443/quote,你是用iphonex的手机测试吗,其他机型是不会复现这个问题的
回复 DCloud_iOS_WZT: iphone11也会,或者iphoneXR
回复 5***@qq.com: 我用xr测试是没问题的,更新到最新版本试试?
这是一个iOS端WebSocket连接状态管理的问题。在iOS系统中,WebSocket连接可能进入CLOSED状态(readyState=3)但未正确触发相应事件回调。
主要原因: iOS系统的网络层实现与Android存在差异,当连接异常关闭时,可能不会按预期触发onClose或onError事件。
解决方案:
- 添加连接状态轮询检测:
// 创建连接后启动状态检测
let checkInterval = setInterval(() => {
if (ws.readyState === 3) {
clearInterval(checkInterval)
// 手动处理连接关闭逻辑
handleConnectionClose()
}
}, 1000)
// 连接成功时清除定时器
ws.onOpen(() => {
clearInterval(checkInterval)
console.log('WebSocket连接已打开')
})
- 使用uni.onSocket系列API替代:
uni.connectSocket({
url: url,
success: () => {
uni.onSocketOpen(() => {
console.log('连接已打开')
})
uni.onSocketError(() => {
console.log('连接错误')
})
uni.onSocketClose(() => {
console.log('连接已关闭')
})
}
})
- 添加连接超时机制:
let connectTimeout = setTimeout(() => {
if (ws.readyState !== 1) {
ws.close()
// 执行重连或错误处理
}
}, 10000) // 10秒超时
ws.onOpen(() => {
clearTimeout(connectTimeout)
})


