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的手机测试吗,其他机型是不会复现这个问题的

回复 5***@qq.com: 只有iphoneX必现么? 我手里没有iphoneX,用其他iphoneX也会出现同样的问题吗

回复 DCloud_iOS_WZT: iphone11也会,或者iphoneXR

回复 5***@qq.com: 我用xr测试是没问题的,更新到最新版本试试?

这是一个iOS端WebSocket连接状态管理的问题。在iOS系统中,WebSocket连接可能进入CLOSED状态(readyState=3)但未正确触发相应事件回调。

主要原因: iOS系统的网络层实现与Android存在差异,当连接异常关闭时,可能不会按预期触发onClose或onError事件。

解决方案:

  1. 添加连接状态轮询检测:
// 创建连接后启动状态检测
let checkInterval = setInterval(() => {
    if (ws.readyState === 3) {
        clearInterval(checkInterval)
        // 手动处理连接关闭逻辑
        handleConnectionClose()
    }
}, 1000)

// 连接成功时清除定时器
ws.onOpen(() => {
    clearInterval(checkInterval)
    console.log('WebSocket连接已打开')
})
  1. 使用uni.onSocket系列API替代:
uni.connectSocket({
    url: url,
    success: () => {
        uni.onSocketOpen(() => {
            console.log('连接已打开')
        })
        uni.onSocketError(() => {
            console.log('连接错误')
        })
        uni.onSocketClose(() => {
            console.log('连接已关闭')
        })
    }
})
  1. 添加连接超时机制:
let connectTimeout = setTimeout(() => {
    if (ws.readyState !== 1) {
        ws.close()
        // 执行重连或错误处理
    }
}, 10000) // 10秒超时

ws.onOpen(() => {
    clearTimeout(connectTimeout)
})
回到顶部