This commit is contained in:
anlicheng 2026-04-03 15:37:22 +08:00
parent 092959f665
commit 95fe9c4d35
2 changed files with 36 additions and 2 deletions

View File

@ -10,6 +10,10 @@ import NetworkExtension
import SwiftUI
import Observation
enum VPNManagerError: Error {
case disconnected
}
// vpn
@Observable
class VPNManager {
@ -38,10 +42,10 @@ class VPNManager {
NSLog("enable vpn with options: \(options)")
let manager = try await loadAndCreateProviderManager()
try await manager.loadFromPreferences()
self.manager = manager
self.addVPNStatusObserver(manager)
try manager.connection.startVPNTunnel(options: options)
self.manager = manager
}
// vpn
@ -52,6 +56,29 @@ class VPNManager {
try await manager.loadFromPreferences()
manager.connection.stopVPNTunnel()
self.manager = nil
}
func sendMessage(_ message: Data) async throws -> Data {
guard let session = self.manager?.connection as? NETunnelProviderSession else {
throw VPNManagerError.disconnected
}
guard session.status == .connected || session.status == .connecting else {
throw VPNManagerError.disconnected
}
return try await withCheckedThrowingContinuation { continuation in
do {
try session.sendProviderMessage(message) { responseData in
//
continuation.resume(returning: responseData ?? Data())
}
} catch {
//
continuation.resume(throwing: error)
}
}
}
// MARK: - Private Methods

View File

@ -110,6 +110,13 @@ class AppContext {
try await self.vpnManager.enableVpn(options: options)
self.networkContext = context
self.vpnOptions = options
// TODO
Task {
try await Task.sleep(for: .seconds(5))
let resp = try await self.vpnManager.sendMessage("hello vpn".data(using: .utf8)!)
NSLog("resp: \(String(data: resp, encoding: .utf8))")
}
}
//