Правила NetworkExtension connectOnDemand не работают

У меня есть приложение с конфигурацией VPN, созданное новой структурой NetworkExtension. Он отлично работает, но теперь мне нужно добавить некоторые правила, чтобы включить этот VPN только тогда, когда я пытаюсь подключиться к определенному URL-адресу. Я планировал использовать функцию connectOnDemand NEVPNManager, но, похоже, она у меня не работает. Когда я открываю http://some-site.com в Safari, мое VPN-соединение должно устанавливаться, но для некоторых причина, по которой это не так. Я пробовал разные типы конфигураций, а также использовал сгенерированные файлы .mobileconfig, чтобы заставить работать connectOnDemand, но безуспешно. Что с этим не так? Я тестирую такой код:

let manager = NEVPNManager.sharedManager()

manager.enabled = true

manager.loadFromPreferencesWithCompletionHandler { (err) -> Void in
    manager.removeFromPreferencesWithCompletionHandler { (err0) -> Void in
                print("err0 \(err0)")
                print("err \(err)")
                let config = NEVPNProtocolIPSec()
                config.localIdentifier = "NEVPNProtocolIPSec"
                config.remoteIdentifier = "NEVPNProtocolIPSecRemote"
                config.disconnectOnSleep = true
                config.serverAddress = server
                config.authenticationMethod = .Certificate
                //configurating here
                manager.protocolConfiguration = config
                let onDemandRule1 = NEOnDemandRuleConnect()
                onDemandRule1.DNSSearchDomainMatch = ["some-site.com", "*.some-site.com"]

                manager.onDemandRules = [onDemandRule1]
                manager.onDemandEnabled = true
                manager.saveToPreferencesWithCompletionHandler({ (err2) -> Void in
                    print("err2 \(err2)")
                })
            }
        }

person Alexey Sidorov    schedule 07.04.2016    source источник
comment
@NikeshK, может быть, вам есть что добавить сюда?   -  person Alexey Sidorov    schedule 07.04.2016


Ответы (2)


Я заставил его работать со следующими правилами:

let onDemandRule = NEOnDemandRuleEvaluateConnection()
let evaluateRule = NEEvaluateConnectionRule(matchDomains: ["*.some-site.com"], andAction: .ConnectIfNeeded)
evaluateRule.probeURL = NSURL(string: "https://a.url.accecable.only.from.vpn")

onDemandRule.connectionRules = [evaluateRule]
manager.protocolConfiguration = config
manager.onDemandRules = [onDemandRule]
person Alexey Sidorov    schedule 12.04.2016
comment
Спасибо. Установка домена совпадения на то, что я хотел, и случайный «probeURL» заставил VPN, наконец, запуститься по запросу, когда домен совпадения был посещен. Вы знаете, почему это работает? Не интуитивно понятно, но я, наверное, просто чего-то не понимаю. - person kgaidis; 14.06.2016
comment
есть ли способ сопоставить все домены. как carname.model? - person CoderKK; 18.03.2017

Вам нужно добавить строку

manager.onDemandEnabled = true
person Roee84    schedule 07.04.2016
comment
Спасибо за ответ, я забыл скопировать и вставить эту строку, все равно здесь это не поможет - person Alexey Sidorov; 08.04.2016