VPN: A tunnel may be already active on app startup
Signed-off-by: Roopesh Chander <roop@roopc.net>
This commit is contained in:
@@ -34,10 +34,18 @@ class TunnelsManager {
|
|||||||
init(tunnelProviders: [NETunnelProviderManager]) {
|
init(tunnelProviders: [NETunnelProviderManager]) {
|
||||||
var tunnels = tunnelProviders.map { TunnelContainer(tunnel: $0, index: 0) }
|
var tunnels = tunnelProviders.map { TunnelContainer(tunnel: $0, index: 0) }
|
||||||
tunnels.sort { $0.name < $1.name }
|
tunnels.sort { $0.name < $1.name }
|
||||||
|
var currentTunnel: TunnelContainer? = nil
|
||||||
for i in 0 ..< tunnels.count {
|
for i in 0 ..< tunnels.count {
|
||||||
tunnels[i].index = i
|
let tunnel = tunnels[i]
|
||||||
|
tunnel.index = i
|
||||||
|
if (tunnel.status != .inactive) {
|
||||||
|
currentTunnel = tunnel
|
||||||
|
}
|
||||||
}
|
}
|
||||||
self.tunnels = tunnels
|
self.tunnels = tunnels
|
||||||
|
if let currentTunnel = currentTunnel {
|
||||||
|
setCurrentTunnel(tunnel: currentTunnel)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static func create(completionHandler: @escaping (TunnelsManager?) -> Void) {
|
static func create(completionHandler: @escaping (TunnelsManager?) -> Void) {
|
||||||
@@ -169,14 +177,7 @@ class TunnelsManager {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
tunnel.startActivation(completionHandler: completionHandler)
|
tunnel.startActivation(completionHandler: completionHandler)
|
||||||
currentTunnel = tunnel
|
setCurrentTunnel(tunnel: tunnel)
|
||||||
currentTunnelStatusObservationToken = tunnel.observe(\.status) { [weak self] (tunnel, change) in
|
|
||||||
guard let s = self else { return }
|
|
||||||
if (tunnel.status == .inactive) {
|
|
||||||
s.currentTunnel = nil
|
|
||||||
s.currentTunnelStatusObservationToken = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func startDeactivation(of tunnel: TunnelContainer, completionHandler: @escaping (Error?) -> Void) {
|
func startDeactivation(of tunnel: TunnelContainer, completionHandler: @escaping (Error?) -> Void) {
|
||||||
@@ -188,6 +189,17 @@ class TunnelsManager {
|
|||||||
|
|
||||||
tunnel.startDeactivation()
|
tunnel.startDeactivation()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func setCurrentTunnel(tunnel: TunnelContainer) {
|
||||||
|
currentTunnel = tunnel
|
||||||
|
currentTunnelStatusObservationToken = tunnel.observe(\.status) { [weak self] (tunnel, change) in
|
||||||
|
guard let s = self else { return }
|
||||||
|
if (tunnel.status == .inactive) {
|
||||||
|
s.currentTunnel = nil
|
||||||
|
s.currentTunnelStatusObservationToken = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension NETunnelProviderProtocol {
|
extension NETunnelProviderProtocol {
|
||||||
|
|||||||
Reference in New Issue
Block a user