uni-app SocketTask 真机测试无问题,打包安卓端后无法连接。表现为第一次进入页面退出后(关闭连接),再次进入页面服务器端显示建立了连接且开启成功,但随后直接关闭。

发布于 1周前 作者 gougou168 来自 Uni-App

uni-app SocketTask 真机测试无问题,打包安卓端后无法连接。表现为第一次进入页面退出后(关闭连接),再次进入页面服务器端显示建立了连接且开启成功,但随后直接关闭。

开发环境 版本号 项目创建方式
HBuilderX 3.99 HBuilderX

操作步骤:

第一次进入页面,然后退出页面(关闭连接)后,再次进入页面,在服务器端显示建立了连接,开启成功,然后直接关闭!

预期结果:

退出页面关闭连接,再次进入页面重新建立链接

实际结果:

第一次正常,之后再进入就无法连接。

bug描述:

this.SocketTask =uni.connectSocket({  
    url: 'ws://118.31.77.73:9566?room_id=' + that.list[that.tapId].room_id,  
    header: {  
        'content-type': 'application/json',  
        'Authorization': token  
    },  
    success: (e) => {  
        console.log("创建一个 WebSocket 连接")  
    }  
})  

this.SocketTask.onMessage((res) => {  
    console.log('收到服务器内容:');  

});  

// 监听 WebSocket 连接打开事件    
this.SocketTask.onOpen((res) => {  
    console.log('WebSocket 连接已打开!');  
});  

// 监听 WebSocket 连接关闭事件    
this.SocketTask.onClose((res) => {  
    console.log('WebSocket 连接已关闭!');  
});  

// 监听 WebSocket 错误事件    
this.SocketTask.onError((res) => {  
    console.log('WebSocket 连接错误:');  
});  

使用的vue2语法,在vue2 demo项目 使用vue2的打包正常,在vue3项目使用vue3打包出错。


1 回复

在 uni-app 中,使用 SocketTask 进行 WebSocket 连接时,真机测试没有问题,但打包安卓端后出现连接问题,可能是由于以下原因导致的:

1. WebSocket 连接未正确关闭

在第一次进入页面时,WebSocket 连接可能没有正确关闭,导致再次进入页面时,旧的连接仍然存在,新的连接无法正常建立。

解决方案:

  • 确保在页面退出或组件销毁时,正确关闭 WebSocket 连接。可以在 onUnloadbeforeDestroy 生命周期中调用 SocketTask.close() 方法。
onUnload() {
  if (this.socketTask) {
    this.socketTask.close();
  }
}

2. WebSocket 连接复用问题

在某些情况下,WebSocket 连接可能会被复用,导致新的连接无法正常建立。

解决方案:

  • 在每次建立新的 WebSocket 连接时,确保旧的连接已经关闭,并且重新创建一个新的 SocketTask 实例。
onLoad() {
  if (this.socketTask) {
    this.socketTask.close();
  }
  this.socketTask = uni.connectSocket({
    url: 'wss://your-websocket-url',
    success: () => {
      console.log('WebSocket connected');
    },
    fail: (err) => {
      console.error('WebSocket connection failed', err);
    }
  });
}

3. 安卓端网络权限问题

打包安卓端后,可能由于网络权限问题导致 WebSocket 连接无法正常建立。

解决方案:

  • 确保在 manifest.json 中正确配置了网络权限。
{
  "app-plus": {
    "distribute": {
      "android": {
        "permissions": [
          "<uses-permission android:name=\"android.permission.INTERNET\"/>"
        ]
      }
    }
  }
}

4. WebSocket 连接超时或服务器端问题

服务器端可能对 WebSocket 连接有超时设置,或者服务器端在处理连接时出现问题。

解决方案:

  • 检查服务器端的日志,确认是否有异常或错误信息。
  • 确保服务器端正确处理 WebSocket 连接的建立和关闭。

5. uni-app 打包配置问题

打包安卓端时,可能由于某些配置问题导致 WebSocket 连接无法正常工作。

解决方案:

  • 检查 manifest.json 中的其他配置,确保没有影响网络连接的设置。
  • 尝试使用不同的打包配置或版本进行测试。

6. 调试和日志

在打包后的安卓端应用中,调试和日志输出可能不如真机测试时方便。可以通过以下方式增加调试信息:

  • 在 WebSocket 连接的不同阶段(如连接成功、接收消息、关闭连接等)添加日志输出。
  • 使用 uni.showToastconsole.log 输出关键信息,帮助定位问题。
this.socketTask.onOpen(() => {
  console.log('WebSocket opened');
  uni.showToast({
    title: 'WebSocket opened',
    icon: 'none'
  });
});

this.socketTask.onClose(() => {
  console.log('WebSocket closed');
  uni.showToast({
    title: 'WebSocket closed',
    icon: 'none'
  });
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!