From c0a60a2f3f3fb0b5bd032dbcede14ddc7b48dc62 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 25 Mar 2026 14:10:34 +0800 Subject: [PATCH] fix vpn --- punchnet/Core/VPNManager.swift | 8 +++++- punchnet/Views/AppContext.swift | 25 +++++++++++-------- .../Views/Settings/SettingsAccountView.swift | 4 +++ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/punchnet/Core/VPNManager.swift b/punchnet/Core/VPNManager.swift index 80b62cf..f12b30f 100644 --- a/punchnet/Core/VPNManager.swift +++ b/punchnet/Core/VPNManager.swift @@ -20,13 +20,16 @@ class VPNManager { var vpnStatus: VPNStatus = .disconnected + var vpnStatusStream: AsyncStream + private var vpnStatusCont: AsyncStream.Continuation + enum VPNStatus { case connected case disconnected } private init() { - + (self.vpnStatusStream, self.vpnStatusCont) = AsyncStream.makeStream(of: VPNStatus.self) } // 开启vpn @@ -63,10 +66,13 @@ class VPNManager { NSLog("status channge: \(manager.connection.status)") switch manager.connection.status { case .invalid, .disconnected, .disconnecting: + self?.vpnStatusCont.yield(.disconnected) self?.vpnStatus = .disconnected case .connecting, .connected, .reasserting: + self?.vpnStatusCont.yield(.connected) self?.vpnStatus = .connected @unknown default: + self?.vpnStatusCont.yield(.disconnected) self?.vpnStatus = .disconnected } } diff --git a/punchnet/Views/AppContext.swift b/punchnet/Views/AppContext.swift index 527fc30..e7d730f 100644 --- a/punchnet/Views/AppContext.swift +++ b/punchnet/Views/AppContext.swift @@ -8,8 +8,14 @@ import Foundation import Observation +enum AppContextError: Error { + case nullNetworkSession +} + @Observable class AppContext { + private var vpnManager = VPNManager.shared + var noticePort: Int // 调用 "/connect" 之后的网络信息 @@ -81,7 +87,7 @@ class AppContext { // 连接到对应的网络 func connectNetwork() async throws { guard let session = self.networkSession else { - return + throw AppContextError.nullNetworkSession } let context = try await SDLAPIClient.connectNetwork(accesToken: session.accessToken) @@ -95,12 +101,19 @@ class AppContext { hostname: context.hostname, noticePort: noticePort ) { - try await VPNManager.shared.enableVpn(options: options) + try await self.vpnManager.enableVpn(options: options) self.networkContext = context self.vpnOptions = options } } + // 退出登陆 + func logout() async throws { + try await self.vpnManager.disableVpn() + self.networkContext = .default() + self.loginCredit = nil + } + func loadCacheToken() -> String? { if let data = try? KeychainStore.shared.load(account: "token") { return String(data: data, encoding: .utf8) @@ -118,12 +131,4 @@ class AppContext { } return nil } - - // 退出登陆 - func logout() async throws { - try await VPNManager.shared.disableVpn() - self.networkContext = .default() - self.loginCredit = nil - } - } diff --git a/punchnet/Views/Settings/SettingsAccountView.swift b/punchnet/Views/Settings/SettingsAccountView.swift index 027b6aa..94cb0ec 100644 --- a/punchnet/Views/Settings/SettingsAccountView.swift +++ b/punchnet/Views/Settings/SettingsAccountView.swift @@ -115,12 +115,14 @@ extension SettingsAccountView { Task { @MainActor in try await appContext.logout() } + self.appContext.appScene = .login(username: username) self.openWindow(id: "main") } .buttonStyle(.bordered) .foregroundColor(.red) } )) + } } @@ -136,7 +138,9 @@ extension SettingsAccountView { Task { @MainActor in try await appContext.logout() } + self.appContext.appScene = .login(username: nil) self.openWindow(id: "main") + // 执行关闭当前窗口的操作 } .buttonStyle(.bordered) .foregroundColor(.red)