Question Blocs de connexion VPN iOS Passage de la 4G à la connexion WiFi


Je crée une connexion VPN dans Swift avec la règle de connexion à la demande ci-dessous:

        let config = NEVPNProtocolIPSec()
        config.serverAddress = ""
        config.username = ""
        config.passwordReference = ""
        config.authenticationMethod = .sharedSecret
        config.sharedSecretReference = ""
        config.useExtendedAuthentication = true
        config.disconnectOnSleep = true

        let connectRule = NEOnDemandRuleConnect()
        connectRule.interfaceTypeMatch = .any
        vpnManager.onDemandRules = [connectRule]

        vpnManager.protocolConfiguration = config
        vpnManager.localizedDescription = ""
        vpnManager.isOnDemandEnabled = true
        vpnManager.isEnabled = true

Cette connexion fonctionne bien. Si j'utilise le WiFi, il se reconnecte après la déconnexion du WiFi mais pas l'inverse. Si j'utilise une connexion cellulaire et que j'essaie d'activer le WiFi, le téléphone ne se connecte pas au WiFi tant que je ne l'ai pas déconnecté du VPN manuellement. Je crois qu'une connexion VPN active bloque le passage de la 4G au WiFi.

Comment puis-je résoudre ce problème?


13
2018-05-16 20:16


origine


Réponses:


À l'extension, ajoutez un observateur pour defaultPath. Ensuite, vous serez averti lorsque l'interface changera et vous pourrez vous reconnecter avec le WIFI.

Modifier: exemple de code

//add observer
let options = NSKeyValueObservingOptions([.new, .old])
self.addObserver(self, forKeyPath: "defaultPath", options: options, context: nil)

//detect interface changes
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if let keyPath = keyPath {
            if keyPath == "defaultPath" {
                let oldPath = change?[.oldKey] as! NWPath
                let newPath = change?[.newKey] as! NWPath
                //expensive is 3g, not expensive is wifi
                if !oldPath.isEqual(to: newPath)) {
                  //disconnect the VPN, maybe with cancelTunnelWithError
                }
            }
       }
}

5
2018-05-25 11:27