默认
发表评论 3
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已解决] 微信小程序MobileIMSDK 的退出登录方法有bug
如果我调用这个 wx.IMSDK.disconnectSocket();方法,日志会爆红,我不是很清楚什么意思,虽然服务端已经显示下线了,但是日志爆红,总感觉很怪。 [已解决] 微信小程序MobileIMSDK 的退出登录方法有bug_1742610880963.jpg                                     [已解决] 微信小程序MobileIMSDK 的退出登录方法有bug_1742610935559.jpg

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:[已回复] 如果我在阿里云买了DV SSL证书,怎么配置到MobileIMSDK代码里下一篇:安卓UDP SDK里connectedToServer这个值默认为true好像不合理
推荐方案
评论 3
看到了,不小心复制粘贴时把uniapp的代码贴到了里面。

你把sdk里的这个方法,用我的这个版本覆盖一下再试试:
  /**
   * 强制关闭本地WebSocket。
   * 一旦调用本方法后,再次调用{[url=home.php?mod=space&uid=5196]@link[/url] #getLocalSocket()}将会返回一个全新的WebSocket对象引用。
   *
   * 本方法通常在两个场景下被调用:
   * 1) 真正需要关闭WebSocket时(如所在的浏览器退出时);
   * 2) 当调用者检测到网络发生变动后希望重置以便获得健康的WebSocket引用对象时。
   * 
   * @param {boolean} silentClose true表示close前会清掉为此socket实例设置的各种回调,确保close时不会触发这些回调(比如:在
   * 掉线重连场景下,close掉前一个旧的失效socket就不会错误地触发这些回调,而且还因为close是异步的,从而会引发一系列不可预测的行为)。
   */
  closeLocalSocket(silentClose) {
    let silentCloseTag = (silentClose?"silentClose="+silentClose:"silentClose=false");
  
    if (wx.MBCore.debugEnabled())
      wx.MBUtils.mblog_d(this.TAG, "正在closeLocalSocket()...");

    let that = this;
	  let thatSocket = this.localSocket;
    if (this.localSocket) {
      try {
        // close前会清掉为此socket实例设置的各种回调,确保close时不会触发这些回调(比如:在掉线重连场景下,close
        // 掉前一个旧的失效socket就不会错误地触发这些回调,而且还因为close是异步的,从而会引发一系列不可预测的行为)
        if(silentClose) {
          thatSocket.onError(null);
          thatSocket.onClose(null);
          thatSocket.onOpen(null);
          thatSocket.onMessage(null);
          
          if (wx.MBCore.debugEnabled())
            wx.MBUtils.mblog_d(this.TAG, "closeLocalSocket("+silentCloseTag+")时,清理socket上的回调函数完成.");
        }

        // 真正开始关闭socket了
        thatSocket.close({
          success: () =>{
            wx.MBUtils.mblog_d(that.TAG, "closeLocalSocket("+silentCloseTag+"):success.");
          },
          fail: () =>{
            wx.MBUtils.mblog_w(that.TAG, "closeLocalSocket("+silentCloseTag+"):fail!");
          },
          complete: ()=>{
            wx.MBUtils.mblog_w(that.TAG, "closeLocalSocket("+silentCloseTag+"):complete。");
          }
        });
        
        // 确保本次清理的socket实例是本方法初始时的那个实例(排除因异步等原因this.localSocket被重新设置后又在此被错误地置空,那就坑爹了)
        if(Object.is(thatSocket, this.localSocket)){
          this.localSocket = null;
        }
      } catch (e) {
        wx.MBUtils.mblog_w(this.TAG, "在closeLocalSocket("+silentCloseTag+")方法中试图释放localSocket资源时:", e);
      }
    } else {
      wx.MBUtils.mblog_d(this.TAG, "Socket处于未初化状态(可能是您还未登陆),无需关闭。");
    }
  }
引用:JackJiang 发表于 2025-03-22 10:51
看到了,不小心复制粘贴时把uniapp的代码贴到了里面。

你把sdk里的这个方法,用我的这个版本覆盖一下再 ...

用了这个就没红色bug爆出了
引用:921124136 发表于 2025-03-24 10:40
用了这个就没红色bug爆出了

嗯嗯,这个版本的几个工程同步更新时贴错了地方,回归测试时也漏掉了这一个函数的用例测试,下个版本会更新到交付物里
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部