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

9 回复

提供一个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的报错回调也不触发,你帮我看一下,谢谢老哥

老哥,已解决,服务端链接问题,服务端ATS没通过,然后wss:后边需要加两个//,打扰了,老哥。主要是uniapp这个监听报错onError不监听报错。看不到报错信息。

回复 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)可能导致连接状态异常。

解决方案:

  1. 设置超时并重连:在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);
    }
    
  2. 使用原生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
回到顶部