uniapp socket熄屏掉线问题如何解决

在uniapp中使用WebSocket连接时,遇到手机熄屏后Socket自动断开的问题。尝试过监听onHide和onShow生命周期,重新连接Socket,但效果不稳定。也试过设置后台运行权限和保持常亮,仍然无法彻底解决。想知道有没有可靠的方案能让Socket在熄屏状态下保持长连接?或者官方是否有针对这个问题的解决方案?

2 回复

使用uni-app的Socket API时,可在app.vue中监听应用状态变化,在onHide时关闭Socket,onShow时重连。也可设置心跳包保持连接,或使用uni.onPushMessage处理后台推送。


在 UniApp 中,Socket 连接在设备熄屏后可能因系统休眠或网络切换导致断开。以下是解决方案:

  1. 启用后台运行权限

    • manifest.json 中配置后台运行权限(仅限 App 端):
      {
        "app-plus": {
          "background": {
            "title": "网络连接保持",
            "type": "socket"
          }
        }
      }
      
    • Android 需额外在代码中申请电池优化忽略权限(部分系统需用户手动授权)。
  2. 实现心跳机制
    定期发送心跳包维持连接,示例代码:

    let socketTask = null;
    let heartbeatInterval = null;
    
    // 建立 Socket 连接
    function connectSocket() {
      socketTask = uni.connectSocket({
        url: 'wss://your-server.com',
        success: () => {
          startHeartbeat(); // 连接成功后开始心跳
        }
      });
    
      socketTask.onClose(() => {
        clearInterval(heartbeatInterval);
        // 可在此处触发重连逻辑
      });
    }
    
    // 心跳包发送
    function startHeartbeat() {
      heartbeatInterval = setInterval(() => {
        if (socketTask.readyState === WebSocket.OPEN) {
          socketTask.send({ data: 'ping' });
        }
      }, 30000); // 每30秒发送一次
    }
    
  3. 监听网络状态变化
    使用 UniApp 网络状态 API 检测到网络恢复时重连:

    uni.onNetworkStatusChange((res) => {
      if (res.isConnected) {
        reconnectSocket();
      }
    });
    
  4. 熄屏事件处理(App 端)
    监听设备熄屏/亮屏事件(需原生插件支持,如 uni-plugin-light):

    // 示例:亮屏时检查连接
    document.addEventListener('resume', () => {
      if (socketTask.readyState !== WebSocket.OPEN) {
        reconnectSocket();
      }
    });
    

注意事项

  • 心跳间隔建议 25-30 秒,避免过于频繁耗电。
  • 重连逻辑需添加延迟(如指数退避)防止频繁请求。
  • 小程序端受平台限制,可能无法完全解决熄屏断线(需依赖微信后台机制)。

通过以上方法可显著提升连接稳定性,但无法 100% 避免断线,需在业务层添加重连和状态同步逻辑。

回到顶部