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
相关产品推荐
相关产品推荐

