websocket在uni-app真机运行时打不开主因是协议不匹配(ws被拦截)和域名未白名单;需配置wss合法域名、启用webview调试,或用自定义基座;消息需防粘包、统一字符串传输;后台自动断连应主动关闭并智能重连;多页面须单例管理连接。

uni-app里WebSocket连接打不开,onOpen不触发?
多数情况不是代码写错了,而是App端没开调试模式或没配白名单。真机运行时,uni.connectSocket默认走HTTPS协议,但很多本地测试用的WebSocket服务是ws://开头——这在iOS和Android原生层会被直接拦截。
- 真机调试前,先在
manifest.json里勾选「启用WebView调试」(仅开发阶段) - 必须在
h5和app两个平台都配置合法域名:进「HBuilderX → 项目 → manifest.json → App SDK配置 → WebSocket合法域名」填wss://your-domain.com,ws://不行 - 如果后端只提供
ws://(比如本地localhost:8080),只能用自定义基座打包,否则连不上
消息收发卡顿、重复触发onMessage?
这不是WebSocket本身的问题,而是uni-app的onMessage回调在App端会把二进制数据自动转成字符串,且没有做粘包/分包处理。后端一次发10条消息,可能被合并成一条ArrayBuffer传进来,或者拆成3次调用。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 别直接
JSON.parse(res.data),先判断typeof res.data === 'string'再解析,否则遇到二进制会报错 - 自己加简单帧头:比如每条消息前加4字节长度字段,收到后手动切分,避免粘包
- 发送消息前统一用
JSON.stringify(),别传对象或数组原生值,App端对非字符串类型兼容性差
App退到后台后WebSocket自动断开,怎么保活?
Android/iOS系统会在App进入后台后10–30秒内回收WebSocket连接,这是系统行为,uni-app没法绕过。强行轮询重连反而耗电、被系统杀进程。
- 监听
uni.onHide,主动uni.closeSocket(),避免残留连接占用资源 - 监听
uni.onShow,检查socketTask状态,若已断开就重新connectSocket - 不要设太激进的重连策略:首次失败后等3秒,第二次等6秒,最多试3次,避免触发平台限频
- 真正需要强实时的场景(如客服消息),得配合离线推送(个推/华为Push)补位,WebSocket只负责前台活跃期
多页面共用一个WebSocket连接,怎么管理实例?
每个页面都connectSocket会导致多个连接并存,后端压力大,消息也容易乱序。uni-app没内置连接池,得自己控制单例。
- 把
uni.connectSocket封装成全局函数,返回的socketTask存在globalData或uni.$socket上 - 所有页面通过
uni.$socket.send发消息,而不是各自调socketTask.send - 页面
onUnload时别closeSocket,只清理自己的监听回调;由首页或登录页统一管理生命周期 - 注意
onMessage注册多次会触发多次,每次注册前先offMessage,或用once语义包装










