收藏
回答

微信小程序中关于mqtt在小程序切后台后长连接强制断开后重连的问题?

在使用mqtt.js客户端连接阿里云物联网平台后,当小程序在前台(或者息屏)时基本都正常。一旦小程序切刀后台,5秒后微信将断开小程序的长连接。当小程序再回到前台时,mqtt的客户端无法自动重连(有时候会耗时很长可能重连成功),这样的话体验就很不好。不知道大家是如何做的?

回答关注问题邀请回答
收藏

7 个回答

  • 木偶
    木偶
    09-14

    遇到了同样的问题,原因是小程序切到后台 5s 会强制挂起 JS 线程(https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/operating-mechanism.html#_1-3-%E6%8C%82%E8%B5%B7),导致长链断开

    解决思路:在小程序到前台时,调用 reconnect 方法,并使用额外状态判断是否是连接状态

    class MqttChat {
      private client: Client
      private reconnect = false
      /**
       * 在微信小程序中,如果应用切到后台,会导致长链断掉,但是 mqtt 里的 connected 仍然是 true,
       * 所以需要自己维护一个 connected 状态
       */
      public connected = false
    
      constructor(options: MqttChatClientOptions) {
        const { userId, ...restOptions } = options
        this.options = options
        this.userId = userId
    
        this.client = mqtt.connect(`wxs://${mqttHost}:${port}/mqtt`, {
          ...restOptions,
          // 认证信息
          clientId: MqttChat.getClientId(userId)
        })
        this.initEventListeners()
      }
    
    
      private initEventListeners() {
        this.client.on('connect', packet => {
          // 实际连接状态
          this.connected = true
          // 订阅消息
          this.client.subscribe('topic')
          if (!this.reconnect) {
            // 第一次连接成功
          }
        })
    
    
        this.client.on('reconnect', () => {
          this.reconnect = true
        })
    
    
        wx.onAppShow(() => {
          // 切换到前台时,极大概率是断连了,需要重新连接
          this.connected = false
          this.client.reconnect()
        })
      }
    }
    
    
    export default MqttChat
    


    09-14
    有用
    回复
  • leCheng
    leCheng
    2023-11-20

    mark 有相同的问题

    2023-11-20
    有用
    回复
  • 兵兵
    兵兵
    2023-03-24

    屏幕放置一段时间后,不息屏也会断开

    2023-03-24
    有用
    回复
  • 古耳朗瓦
    古耳朗瓦
    2021-03-18

    遇到同样问题,苦恼中。

    想尝试一下,on hide 就DISCONNECT, 然后ON SHOW 就再CONNECT.

    2021-03-18
    有用
    回复 1
    • 悟渔
      悟渔
      2021-06-27
      想法不错,我用的是client.end()方法关闭连接.
      2021-06-27
      回复
  • 李法昌
    李法昌
    2020-07-06

    我现在的做法是,每次切后台后强制断开,再回前台时,再重连(创建新的client对象)。

    2020-07-06
    有用
    回复 1
    • 超人不会飞
      超人不会飞
      2021-05-09
      大哥 请问你这边强制断开的语句是什么 我这边百度没有找到 方便说一下吗
      2021-05-09
      回复
  • YeKao
    YeKao
    2020-07-06

    我也遇到这个问题,有没有大佬有好点的解决方案?

    2020-07-06
    有用
    回复
  • ,
    2020-06-29

    有解决吗?遇到一样的问题,息屏会自动重连并连接上,切后台一段时间就重连不上

    2020-06-29
    有用
    回复
登录 后发表内容
问题标签