This commit is contained in:
anlicheng 2026-03-03 14:57:38 +08:00
parent 5e40f5b7a7
commit e2cbaff567
2 changed files with 13 additions and 32 deletions

View File

@ -10,12 +10,11 @@ import NetworkExtension
import SwiftUI
// vpn
class VPNManager: ObservableObject {
class VPNManager {
static let shared = VPNManager()
@Published var vpnStatus: VPNStatus = .disconnected
@Published var title: String = "启动"
@Published var color: Color = .white
private var observation: NSKeyValueObservation?
var vpnStatus: VPNStatus = .disconnected
enum VPNStatus {
case connected
@ -46,23 +45,17 @@ class VPNManager: ObservableObject {
// VPN
private func addVPNStatusObserver(_ manager: NETunnelProviderManager) {
NotificationCenter.default.removeObserver(self)
NotificationCenter.default.addObserver(forName: .NEVPNStatusDidChange, object: manager.connection, queue: .main) { [unowned self] (notification) -> Void in
// vpn
switch manager.connection.status {
self.observation = manager.connection.observe(\.status, options: [.initial, .new]) {[weak self] connection, change in
guard let status = change.newValue else {
return
}
switch status {
case .invalid, .disconnected, .disconnecting:
self.vpnStatus = .disconnected
self.title = "启动"
self.color = .white
self?.vpnStatus = .disconnected
case .connecting, .connected, .reasserting:
self.vpnStatus = .connected
self.title = "停止"
self.color = .red
self?.vpnStatus = .connected
@unknown default:
self.vpnStatus = .disconnected
self.title = "启动"
self.color = .red
self?.vpnStatus = .disconnected
}
}
}

View File

@ -33,7 +33,6 @@ struct punchnetApp: App {
@AppStorage("token") var token: String = ""
@AppStorage("network_code") var networkCode: String = ""
@AppStorage("hostname") var hostname: String = ""
@ObservedObject var vpnManager = VPNManager.shared
private var noticeServer: UDPNoticeCenterServer
@State private var appContext: AppContext
@ -96,7 +95,7 @@ struct punchnetApp: App {
Button(action: {
self.menuClick()
}, label: {
Text(vpnManager.title)
Text("启动")
})
Divider()
@ -111,18 +110,7 @@ struct punchnetApp: App {
}
private func menuClick() {
switch self.vpnManager.vpnStatus {
case .disconnected:
// Task {
// let clientId = SystemConfig.getClientId()
// try await vpnManager.enableVpn(options: SystemConfig.getOptions(networkCode: self.networkCode, token: self.token, clientId: clientId, hostname: self.hostname, noticePort: self.noticeServer.port)!)
// }
()
case .connected:
Task {
try await vpnManager.disableVpn()
}
}
}
}