Fix widget toggle not disabling On Demand before stopping VPN

Store wasOnDemandEnabled flag in providerConfiguration so the widget
can restore On Demand state on next start. Clear the flag when On
Demand is explicitly disabled in settings or when starting from the
main app.
This commit is contained in:
世界
2026-03-09 13:20:53 +08:00
parent c19945f65b
commit efa6088884
3 changed files with 39 additions and 2 deletions
@@ -179,7 +179,7 @@ public class LogViewModel: BaseViewModel {
public init(commandClient: CommandClient, searchText: String = "") { public init(commandClient: CommandClient, searchText: String = "") {
self.commandClient = commandClient self.commandClient = commandClient
self.searchText = searchText self.searchText = searchText
self.isSearching = !searchText.isEmpty isSearching = !searchText.isEmpty
super.init() super.init()
dataModel = LogDataModel(commandClient: commandClient, viewModel: self) dataModel = LogDataModel(commandClient: commandClient, viewModel: self)
} }
+19
View File
@@ -114,6 +114,14 @@ public class ExtensionProfile: ObservableObject {
public func updateOnDemand(enabled: Bool, useDefaultRules: Bool) async throws { public func updateOnDemand(enabled: Bool, useDefaultRules: Bool) async throws {
guard let manager else { return } guard let manager else { return }
manager.isOnDemandEnabled = enabled manager.isOnDemandEnabled = enabled
if !enabled {
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol {
var config = proto.providerConfiguration ?? [:]
if config.removeValue(forKey: "wasOnDemandEnabled") != nil {
proto.providerConfiguration = config
}
}
}
await setOnDemandRules(useDefaultRules: useDefaultRules) await setOnDemandRules(useDefaultRules: useDefaultRules)
try await manager.saveToPreferences() try await manager.saveToPreferences()
} }
@@ -141,6 +149,12 @@ public class ExtensionProfile: ObservableObject {
manager.isOnDemandEnabled = true manager.isOnDemandEnabled = true
await setOnDemandRules(useDefaultRules: alwaysOn) await setOnDemandRules(useDefaultRules: alwaysOn)
} }
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol {
var config = proto.providerConfiguration ?? [:]
if config.removeValue(forKey: "wasOnDemandEnabled") != nil {
proto.providerConfiguration = config
}
}
#if !os(tvOS) #if !os(tvOS)
if let protocolConfiguration = manager.protocolConfiguration { if let protocolConfiguration = manager.protocolConfiguration {
let includeAllNetworks = await SharedPreferences.includeAllNetworks.get() let includeAllNetworks = await SharedPreferences.includeAllNetworks.get()
@@ -239,6 +253,11 @@ public class ExtensionProfile: ObservableObject {
} }
guard let manager else { return } guard let manager else { return }
if manager.isOnDemandEnabled { if manager.isOnDemandEnabled {
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol {
var config = proto.providerConfiguration ?? [:]
config["wasOnDemandEnabled"] = true
proto.providerConfiguration = config
}
manager.isOnDemandEnabled = false manager.isOnDemandEnabled = false
try await manager.saveToPreferences() try await manager.saveToPreferences()
} }
+19 -1
View File
@@ -51,8 +51,17 @@ enum WidgetTunnelControl {
if started { if started {
if manager.isEnabled == false { if manager.isEnabled == false {
manager.isEnabled = true manager.isEnabled = true
try await manager.saveToPreferences()
} }
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol,
let config = proto.providerConfiguration,
config["wasOnDemandEnabled"] as? Bool == true
{
var newConfig = config
newConfig.removeValue(forKey: "wasOnDemandEnabled")
proto.providerConfiguration = newConfig
manager.isOnDemandEnabled = true
}
try await manager.saveToPreferences()
do { do {
try manager.connection.startVPNTunnel() try manager.connection.startVPNTunnel()
} catch { } catch {
@@ -60,6 +69,15 @@ enum WidgetTunnelControl {
throw error throw error
} }
} else { } else {
if manager.isOnDemandEnabled {
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol {
var config = proto.providerConfiguration ?? [:]
config["wasOnDemandEnabled"] = true
proto.providerConfiguration = config
}
manager.isOnDemandEnabled = false
try await manager.saveToPreferences()
}
manager.connection.stopVPNTunnel() manager.connection.stopVPNTunnel()
} }
} }