Подтвердить что ты не робот

Блоки подключения VPN iOS Переключение 4G на соединение Wi-Fi

Я создаю VPN-соединение в Swift с правилом подключения по требованию ниже:

        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

Это соединение работает нормально. Если я использую WiFi, он снова подключается после отключения от WiFi, но не наоборот. Если я использую сотовую связь и пытаюсь активировать WiFi, телефон не подключается к WiFi, пока я не отключу его вручную. Я считаю, что активные блоки VPN-подключения переключаются с 4G на WiFi.

Как я могу решить эту проблему?

4b9b3361

Ответ 1

В расширении добавьте наблюдателя для defaultPath. Затем вы будете уведомлены, когда интерфейс изменится, и вы сможете подключиться к WIFI

Изменить: пример кода

//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
                }
            }
       }
}