From ffb0527755b0202dbf7b103f595bf581ada3c2c6 Mon Sep 17 00:00:00 2001 From: shum Date: Mon, 17 Aug 2026 12:30:47 +0000 Subject: [PATCH] ios: reconnect servers when network changes iOS does not report the sockets of the previous network as broken, so after switching between Wi-Fi and mobile the agent keeps using dead sessions - setting network info does not drop them. Recovery only happened when the OS finally failed the socket, via TCP keep-alive or the SMP ping monitor, taking from ~90 seconds to tens of minutes. Reconnect the servers on every network change after the first one, when the network is online. Changes that keep the same network type, e.g. switching between Wi-Fi networks, are not detected, as network info only has the network type. --- apps/ios/Shared/Model/NetworkObserver.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/ios/Shared/Model/NetworkObserver.swift b/apps/ios/Shared/Model/NetworkObserver.swift index 84c35afa07..a661157398 100644 --- a/apps/ios/Shared/Model/NetworkObserver.swift +++ b/apps/ios/Shared/Model/NetworkObserver.swift @@ -35,8 +35,12 @@ class NetworkObserver { online: path.status == .satisfied ) if (prevInfo != info) { + // iOS does not report the sockets of the previous network as broken, so the servers have to + // be reconnected. There is nothing to reconnect before the first network info is set. + let shouldReconnect = prevInfo != nil && info.online prevInfo = info setNetworkInfo(info) + if shouldReconnect { reconnectServers() } } } @@ -70,4 +74,15 @@ class NetworkObserver { } } } + + private func reconnectServers() { + Task { + if !hasChatCtrl() { return } + do { + try await reconnectAllServers() + } catch let err { + logger.error("reconnectAllServers error: \(responseError(err))") + } + } + } }