From 5004c0daef0094d6d09fd38742d061c90b21ee38 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Tue, 3 Mar 2026 15:19:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3view=E7=9A=84=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=8F=98=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- punchnet/Core/VPNManager.swift | 34 +++++++++++++++++------- punchnet/Views/Network/NetworkView.swift | 4 ++- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/punchnet/Core/VPNManager.swift b/punchnet/Core/VPNManager.swift index 5953e21..80b62cf 100644 --- a/punchnet/Core/VPNManager.swift +++ b/punchnet/Core/VPNManager.swift @@ -8,12 +8,16 @@ import Foundation import NetworkExtension import SwiftUI +import Observation // vpn管理类 +@Observable class VPNManager { static let shared = VPNManager() - private var observation: NSKeyValueObservation? + private var manager: NETunnelProviderManager? + private var statusObserver: NSObjectProtocol? + var vpnStatus: VPNStatus = .disconnected enum VPNStatus { @@ -30,26 +34,34 @@ class VPNManager { NSLog("enable vpn with options: \(options)") let manager = try await loadAndCreateProviderManager() try await manager.loadFromPreferences() - self.addVPNStatusObserver(manager) + self.manager = manager + self.addVPNStatusObserver(manager) try manager.connection.startVPNTunnel(options: options) } // 关闭vpn func disableVpn() async throws { - let managers = try await NETunnelProviderManager.loadAllFromPreferences() - managers.first?.connection.stopVPNTunnel() + guard let manager = self.manager else { + return + } + + try await manager.loadFromPreferences() + manager.connection.stopVPNTunnel() } // MARK: - Private Methods // 监控系统VPN的状态的变化 private func addVPNStatusObserver(_ manager: NETunnelProviderManager) { - self.observation = manager.connection.observe(\.status, options: [.initial, .new]) {[weak self] connection, change in - guard let status = change.newValue else { - return - } - switch status { + if let statusObserver { + NotificationCenter.default.removeObserver(statusObserver) + self.statusObserver = nil + } + + self.statusObserver = NotificationCenter.default.addObserver(forName: .NEVPNStatusDidChange, object: manager.connection, queue: .main) {[weak self] _ in + NSLog("status channge: \(manager.connection.status)") + switch manager.connection.status { case .invalid, .disconnected, .disconnecting: self?.vpnStatus = .disconnected case .connecting, .connected, .reasserting: @@ -86,7 +98,9 @@ class VPNManager { } deinit { - NotificationCenter.default.removeObserver(self) + if let statusObserver { + NotificationCenter.default.removeObserver(statusObserver) + } } } diff --git a/punchnet/Views/Network/NetworkView.swift b/punchnet/Views/Network/NetworkView.swift index 96c79b4..03baf20 100644 --- a/punchnet/Views/Network/NetworkView.swift +++ b/punchnet/Views/Network/NetworkView.swift @@ -22,6 +22,7 @@ struct NetworkView: View { // 状态管理 @State private var connectState: ConnectState = .disconnected @State private var isOn: Bool = false + @State private var vpnManager: VPNManager = VPNManager.shared // 展示状态 enum ShowMode { @@ -93,7 +94,8 @@ struct NetworkView: View { } .padding(.top, 10) .padding(.leading, 10) - .onChange(of: VPNManager.shared.vpnStatus) { _, newState in + .onChange(of: vpnManager.vpnStatus) { _, newState in + NSLog("print view change: \(newState)") switch newState { case .connected: self.connectState = .connected