Соединение iOS VPN блокирует переключение 4G на соединение WiFi

Я создаю 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 вручную. Я считаю, что активное VPN-соединение блокирует переключение с 4G на WiFi.

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


person mTuran    schedule 16.05.2017    source источник
comment
Что произойдет, если вы откроете Wi-Fi в настройках и щелкните имя своей сети?   -  person Coder-256    schedule 23.05.2017


Ответы (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
                }
            }
       }
}
person Roee84    schedule 25.05.2017
comment
Привет, Roee84, Не могли бы вы привести пример кода для этого? - person mTuran; 27.05.2017
comment
@ Roee84 Roee84 Кроме того, должен ли я учитывать другие аспекты, чтобы иметь VPN, который всегда подключен? Потому что я вижу, что они время от времени отключаются. Спасибо - person Ricardo; 15.07.2018
comment
@Ricardo примера в вопросе должно быть достаточно для всегда подключенного, что-то вроде: - person Roee84; 15.07.2018
comment
@ Roee84 Спасибо. Вроде работает, теперь иконку VPN вижу постоянно, даже если айфон перезагрузить. Проблема у меня сейчас в том, что после нескольких часов использования или смены wifi на 3g и подобное, иногда я вижу это в консоли: error 21:19:25.226644 +0100 Расширение проверки домена __nw_socket_service_writes_block_invoke sendmsg(fd 5, 40 байт): [ 51] Сеть недоступна и не работает снова, пока я не перезапущу вручную. Есть идеи? Должен ли я использовать KVO, примененный к defaultPath, чтобы решить эту проблему. Большое спасибо. - person Ricardo; 21.07.2018
comment
Не знаю, что это за ошибка, но попробуйте с помощью defaultPath обнаружить эти изменения, возможно, это решит вашу проблему. - person Roee84; 22.07.2018