uni-app在ios14.7.1上连接socket不触发onOpen事件,也收不到socket消息
uni-app在ios14.7.1上连接socket不触发onOpen事件,也收不到socket消息
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| uni-app | - | - |
```javascript
socketTask = uni.connectSocket({
url: '', // 地址
success(data) {
console.log("websocket连接成功", data); //会执行到这里,data返回 {"errMsg":"connectSocket:ok"},但是不会触发onOpen,也收不到socket消息
},
complete(msg){
console.log(msg)
},
fail: (err) => {
console.log("报错", err);
}
});
// 连接打开
socketTask.onOpen((res) => {
//这里不会触发
console.log('WebSocket打开');
})
// 监听连接失败
socketTask.onError((err) => {
//这里在ios上也不会触发,在andorid里面我写个错地址还会返回错误,在ios上直接就不触发
console.log(err)
console.log('WebSocket连接打开失败,请检查', err);
})
有没有老哥遇到过我的这个问题啊,打包的自定义调试基座包, 就ios基座调试有问题,android和H5都没有问题。ios上开debug调试模式有一定几率又连的上 手机是iphoneX,系统版本ios14.7.1
相关同样问题帖子: https://ask.dcloud.net.cn/question/118738 https://ask.dcloud.net.cn/question/110944
更多关于uni-app在ios14.7.1上连接socket不触发onOpen事件,也收不到socket消息的实战教程也可以访问 https://www.itying.com/category-93-b0.html
提供一个url我试试,我这边测试是没有问题的
更多关于uni-app在ios14.7.1上连接socket不触发onOpen事件,也收不到socket消息的实战教程也可以访问 https://www.itying.com/category-93-b0.html
wss:www.yiweing.com:8512 老哥,你试一下这个连接试试,主要是我这是windows电脑,看不到Network报错信息。uni的报错回调也不触发,你帮我看一下,谢谢老哥
回复 LRL啊: connectSocket的fail没走么
我用你的代码,走了error的监听了啊
回复 DCloud_iOS_WZT: 没走,在ios基座包里面。没走error,也没走connectSocket的fail,我用uni.onSocketError也监听不到错误,就走到connectSocket的success就没了。
回复 DCloud_iOS_WZT: 我前边翻帖子也有遇到不走error和fail的。导致不知道是什么原因。
标准基座有问题吗?
这个问题在iOS 14.7.1上确实存在,是uni-app底层WebSocket实现与iOS系统兼容性问题导致的。主要原因是iOS系统对WebSocket连接的超时处理机制与Android不同,在特定网络环境下(如弱网或VPN)可能导致连接状态异常。
解决方案:
-
设置超时并重连:在
uni.connectSocket中增加timeout参数,并添加连接状态检查和重连逻辑。let socketTask = null; let reconnectTimer = null; function connectSocket() { socketTask = uni.connectSocket({ url: 'your_url', timeout: 10000, // 设置10秒超时 success: (res) => { console.log("连接创建成功", res); } }); // 设置打开监听 socketTask.onOpen((res) => { console.log('WebSocket已打开'); clearTimeout(reconnectTimer); }); // 设置错误监听 socketTask.onError((err) => { console.log('连接错误', err); reconnect(); }); // 设置关闭监听 socketTask.onClose(() => { console.log('连接关闭'); reconnect(); }); // 超时重连 reconnectTimer = setTimeout(() => { if(socketTask.readyState !== 1) { // 1表示OPEN状态 console.log('连接超时,尝试重连'); socketTask.close(); reconnect(); } }, 10000); } function reconnect() { clearTimeout(reconnectTimer); setTimeout(() => { connectSocket(); }, 2000); } -
使用原生WebSocket:如果上述方法无效,可以考虑使用条件编译调用iOS原生WebSocket API。
// #ifdef APP-PLUS if(uni.getSystemInfoSync().platform === 'ios') { // 使用原生WebSocket const ws = new WebSocket('your_url'); ws.onopen = function() { console.log('原生WebSocket已连接'); }; ws.onmessage = function(e) { console.log('收到消息:', e.data); }; } else { // 使用uni-app的WebSocket connectSocket(); } // #endif


