



















@@ -127,6 +127,8 @@ final class GatewayConnectionController {
127127private let discovery = GatewayDiscoveryModel()
128128private let discoveryEnabled: Bool
129129private weak var appModel: NodeAppModel?
130+private var localNetworkAccessRequested: Bool
131+private var currentScenePhase: ScenePhase = .inactive
130132private var didAutoConnect = false
131133private var pendingServiceResolvers: [String: GatewayServiceResolver] = [:]
132134private var pendingTrustConnect: PendingTrustConnect?
@@ -137,9 +139,14 @@ final class GatewayConnectionController {
137139let useTLS: Bool
138140}
139141140-init(appModel: NodeAppModel, startDiscovery: Bool = true) {
142+init(
143+ appModel: NodeAppModel,
144+ startDiscovery: Bool = true,
145+ deferDiscoveryUntilLocalNetworkRequest: Bool = false)
146+{
141147self.discoveryEnabled = startDiscovery
142148self.appModel = appModel
149+self.localNetworkAccessRequested = !deferDiscoveryUntilLocalNetworkRequest
143150144151GatewaySettingsStore.bootstrapPersistence()
145152let defaults = UserDefaults.standard
@@ -148,7 +155,7 @@ final class GatewayConnectionController {
148155self.updateFromDiscovery()
149156self.observeDiscovery()
150157151-if self.discoveryEnabled {
158+if self.discoveryEnabled, self.localNetworkAccessRequested {
152159self.discovery.start()
153160}
154161}
@@ -157,11 +164,29 @@ final class GatewayConnectionController {
157164self.discovery.setDebugLoggingEnabled(enabled)
158165}
159166167+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+160183func setScenePhase(_ phase: ScenePhase) {
184+self.currentScenePhase = phase
161185guard self.discoveryEnabled else {
162186self.discovery.stop()
163187return
164188}
189+guard self.localNetworkAccessRequested else { return }
165190166191switch phase {
167192case .background:
@@ -181,6 +206,10 @@ final class GatewayConnectionController {
181206self.updateFromDiscovery()
182207return
183208}
209+guard self.localNetworkAccessRequested else {
210+self.requestLocalNetworkAccess(reason: "restart_discovery")
211+return
212+}
184213185214self.discovery.stop()
186215self.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")
200230let instanceId = UserDefaults.standard.string(forKey: "node.instanceId")?
201231.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
202232if 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")
278309let instanceId = GatewaySettingsStore.currentInstanceID()
279310let token =
280311 authOverride.map(\.token) ?? GatewaySettingsStore.loadGatewayToken(instanceId: instanceId)
@@ -340,6 +371,7 @@ final class GatewayConnectionController {
340371}
341372342373func connectLastKnown() async {
374+self.requestLocalNetworkAccess(reason: "connect_last_known")
343375guard let last = GatewaySettingsStore.loadLastGatewayConnection() else { return }
344376switch last {
345377case let .manual(host, port, useTLS, _):
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。