@@ -127,6 +127,8 @@ final class GatewayConnectionController {
127127 private let discovery = GatewayDiscoveryModel ( )
128128 private let discoveryEnabled : Bool
129129 private weak var appModel : NodeAppModel ?
130+ private var localNetworkAccessRequested : Bool
131+ private var currentScenePhase : ScenePhase = . inactive
130132 private var didAutoConnect = false
131133 private var pendingServiceResolvers : [ String : GatewayServiceResolver ] = [ : ]
132134 private var pendingTrustConnect : PendingTrustConnect ?
@@ -137,9 +139,14 @@ final class GatewayConnectionController {
137139 let useTLS : Bool
138140 }
139141
140- init ( appModel: NodeAppModel , startDiscovery: Bool = true ) {
142+ init (
143+ appModel: NodeAppModel ,
144+ startDiscovery: Bool = true ,
145+ deferDiscoveryUntilLocalNetworkRequest: Bool = false )
146+ {
141147 self . discoveryEnabled = startDiscovery
142148 self . appModel = appModel
149+ self . localNetworkAccessRequested = !deferDiscoveryUntilLocalNetworkRequest
143150
144151 GatewaySettingsStore . bootstrapPersistence ( )
145152 let defaults = UserDefaults . standard
@@ -148,7 +155,7 @@ final class GatewayConnectionController {
148155 self . updateFromDiscovery ( )
149156 self . observeDiscovery ( )
150157
151- if self . discoveryEnabled {
158+ if self . discoveryEnabled, self . localNetworkAccessRequested {
152159 self . discovery. start ( )
153160 }
154161 }
@@ -157,11 +164,29 @@ final class GatewayConnectionController {
157164 self . discovery. setDebugLoggingEnabled ( enabled)
158165 }
159166
167+ func requestLocalNetworkAccess( reason: String ) {
168+ guard self . discoveryEnabled else {
169+ self . discovery. stop ( )
170+ self . updateFromDiscovery ( )
171+ return
172+ }
173+
174+ self . localNetworkAccessRequested = true
175+ GatewayDiagnostics . log ( " local network access requested reason= \( reason) " )
176+
177+ guard self . currentScenePhase != . background else { return }
178+ self . discovery. start ( )
179+ self . updateFromDiscovery ( )
180+ self . attemptAutoReconnectIfNeeded ( )
181+ }
182+
160183 func setScenePhase( _ phase: ScenePhase ) {
184+ self . currentScenePhase = phase
161185 guard self . discoveryEnabled else {
162186 self . discovery. stop ( )
163187 return
164188 }
189+ guard self . localNetworkAccessRequested else { return }
165190
166191 switch phase {
167192 case . background:
@@ -181,6 +206,10 @@ final class GatewayConnectionController {
181206 self . updateFromDiscovery ( )
182207 return
183208 }
209+ guard self . localNetworkAccessRequested else {
210+ self . requestLocalNetworkAccess ( reason: " restart_discovery " )
211+ return
212+ }
184213
185214 self . discovery. stop ( )
186215 self . didAutoConnect = false
@@ -197,6 +226,7 @@ final class GatewayConnectionController {
197226 _ gateway: GatewayDiscoveryModel . DiscoveredGateway ,
198227 forceReconnect: Bool = false ) async -> String ?
199228 {
229+ self . requestLocalNetworkAccess ( reason: " connect_discovered_gateway " )
200230 let instanceId = UserDefaults . standard. string ( forKey: " node.instanceId " ) ?
201231 . trimmingCharacters ( in: . whitespacesAndNewlines) ?? " "
202232 if instanceId. isEmpty {
@@ -275,6 +305,7 @@ final class GatewayConnectionController {
275305 authOverride: ManualAuthOverride ? = nil ,
276306 forceReconnect: Bool = false ) async
277307 {
308+ self . requestLocalNetworkAccess ( reason: " connect_manual " )
278309 let instanceId = GatewaySettingsStore . currentInstanceID ( )
279310 let token =
280311 authOverride. map ( \. token) ?? GatewaySettingsStore . loadGatewayToken ( instanceId: instanceId)
@@ -340,6 +371,7 @@ final class GatewayConnectionController {
340371 }
341372
342373 func connectLastKnown( ) async {
374+ self . requestLocalNetworkAccess ( reason: " connect_last_known " )
343375 guard let last = GatewaySettingsStore . loadLastGatewayConnection ( ) else { return }
344376 switch last {
345377 case let . manual( host, port, useTLS, _) :
0 commit comments