Me encontré con un problema al usar NetworkExtension en Swift para utilizar OpenVPN o Wireguard con NETunnelProviderManager .
Tengo el siguiente código en ViewDidLoad de mi mainViewController. No lo cargo dos veces y funciona bien cuando uso el IKEv2 integrado de Apple.
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.NEVPNStatusDidChange, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(vpnStatusDidChange(_:)), name: NSNotification.Name.NEVPNStatusDidChange, object: nil)Pero cuando uso OpenVPN o Wireguard a través de Networkextension, estos eventos de cambio de estado de red siguen activando n+1. Primera vez dispara una vez. La segunda vez que me conecto y desconecto, veo que los estados de la red se disparan dos veces, luego tres veces, etc.
He estado investigando mucho y parece que el problema está en el siguiente código:
func loadTunnelProviderManager(completion:@escaping () -> Void) { NETunnelProviderManager.loadAllFromPreferences { (managers, error) in if error == nil { self.tunnelProviderManager = managers?.first ?? NETunnelProviderManager() completion() } } } Si no recupero managers?.first y lo instalo cada vez:
self.tunnelProviderManager = NETunnelProviderManager()Entonces el problema está resuelto. Sin embargo, cada vez que me conecto a la VPN, inevitablemente también se crea una nueva configuración de VPN en la configuración, lo cual no es lo ideal.
TL;RD
Para resumir, ¿cómo elimino todos los administradores existentes antes de instanciar un nuevo NETunnelProviderManager ? Sé que esto podría ir en contra de la convención, pero resolverá el problema.