You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

App切换器通知过于敏感引发Socket连接异常问题咨询

解决Socket重复连接问题:区分临时活跃状态与后台场景

你的核心问题是误用了UIApplication.willResignActiveNotification——这个通知会在所有应用失去焦点的场景触发,包括上滑底部栏、呼出控制中心/通知中心这类临时操作,并非真正的后台切换。频繁触发导致Socket关闭和重建逻辑重复执行,旧连接未完全断开就新建连接,最终引发服务器端连接池溢出。

解决方案步骤:

  • 替换触发关闭的通知
    改用UIApplication.didEnterBackgroundNotification,仅当应用真正进入后台(切换到其他App、按Home键返回主屏幕)时才执行Socket关闭操作,避免临时操作误触发。

  • 增加Socket状态校验
    在重建Socket前,先检查当前Socket的连接状态,确保旧连接已完全关闭后再创建新连接,避免重复实例化。

  • 优化活跃状态恢复逻辑
    在didBecomeActive中增加额外判断,避免重复执行订阅逻辑(比如用户只是呼出控制中心再返回,不需要重新订阅)。

修改后的代码示例:

// 替换willResignActive为didEnterBackground,仅在真正进入后台时关闭Socket
NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: .main) { _ in
    print("SOCKET: Close socket triggered (app entered background)")
    SIM.sharedCallbackSocket.closeSocket()
    SIM.sharedFeedSocket.closeSocket()
}

NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { _ in
    print("App is active now")
    guard userStateViewModel.isAuthenticationDone else { return }
    
    // 检查Socket状态,确保未连接时才重新订阅
    if !SIM.sharedCallbackSocket.isConnected {
        let _ = SIM.sharedCallbackSocket.subscribeCallbackChannels()
    }
    if !SIM.sharedFeedSocket.isConnected {
        let _ = SIM.sharedFeedSocket.subscribe(scrips: [], subscribeAll: true)
    }
}

额外优化建议:

  • 给closeSocket()方法增加回调或状态标记,确保关闭操作完成后再允许重建连接(比如添加一个isClosing布尔值,关闭过程中拒绝新的连接请求)。
  • 对Socket连接操作添加防抖逻辑,避免短时间内多次触发重建。

内容的提问来源于stack exchange,提问作者Hitesh Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:22:33