NEHotspotHelper: невозможно отправить веб-запрос в состоянии аутентификации конечного автомата аутентификации

Я реализовал NEHotspotHelper, чтобы выполнять аутентификацию в фоновом режиме для сетей с авторизованным порталом.

Мне нужно выполнить веб-запрос в состоянии «аутентификация», чтобы я мог получить Wispr, а также получить доступ к API.

Однако, когда я пытаюсь использовать URLSession для отправки веб-запроса, запрос завершается ошибкой. Это ошибка:

[594:88737] dnssd_clientstub read_all(7) DEFUNCT
[594:88783] TIC TCP Conn Failed [4:0x1c0177a00]: 12:8 Err(-65554)
[594:88783] Task <FFD0DAE6-4864-437D-94F2-C9ED5D5748E2>.<1> HTTP load failed (error code: -1003 [12:8])
[594:88783] Task <FFD0DAE6-4864-437D-94F2-C9ED5D5748E2>.<1> finished with error - code: -1003

См. фрагмент моего кода:


 let registered = NEHotspotHelper.register(options: options, queue: queue) { (cmd: NEHotspotHelperCommand) in
    print("Received command: \(cmd.commandType.rawValue)")
    if cmd.commandType == NEHotspotHelperCommandType.filterScanList {
        //Get all available hotspots
        print("filter scan list")
        var list: [NEHotspotNetwork] = cmd.networkList!
        var response: NEHotspotHelperResponse
        for l in list {
            if (l.ssid=="my-ssid") {
                response = cmd.createResponse(NEHotspotHelperResult.success)
            } else {
                response = cmd.createResponse(NEHotspotHelperResult.failure)                       
            }
            response.setNetworkList([chosenNetwork])
            response.deliver()
        }   
    } else if cmd.commandType == NEHotspotHelperCommandType.evaluate {
        if let network = cmd.network {            
            if (network.ssid=="my-ssid") {            
                network.setConfidence(NEHotspotHelperConfidence.high)
                let response = cmd.createResponse(NEHotspotHelperResult.success)
                response.setNetwork(network)                 
                response.deliver() //Respond back
            } else {
                let response = cmd.createResponse(NEHotspotHelperResult.failure)
                response.deliver()
            }
        }
    } else if cmd.commandType == NEHotspotHelperCommandType.authenticate {
        print("authenticate")
        var response = cmd.createResponse(NEHotspotHelperResult.unsupportedNetwork)
        if let network = cmd.network{
            if network.ssid == "my-ssid"{
                self.queryUrl()
                response = cmd.createResponse(NEHotspotHelperResult.success)
            }
        }
        response.deliver() //Respond back                    
    }
}

func queryUrl(){
    let config = URLSessionConfiguration.default
    config.allowsCellularAccess = false;

    let session = URLSession.init(configuration: config)

    let url = URL(string: "https://172.217.20.35")

    let semaphore = DispatchSemaphore(value: 0)
    let task = session.dataTask(with: url!){(data, response, error) in
        if  data==nil {
            print(data as Any)            
        }
        else{
            print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) as Any)
        }
        semaphore.signal()
    }

    task.resume()
    _ = semaphore.wait(timeout: .distantFuture)    
}

person user3344429    schedule 24.01.2018    source источник
comment
Вы всегда должны доставлять. Но только один раз за полученную команду.   -  person Pierre    schedule 26.01.2018
comment
Измените свой веб-запрос на синхронный вызов и доставляйте только один раз после того, как вы завершили вход в систему через запрос. Если время ожидания вашего запроса истекло, все равно доставьте успех. Не заставляйте ОС слишком долго ждать, пока вы что-то вернете. Я бы сказал, максимум 1 минута   -  person Pierre    schedule 26.01.2018
comment
Спасибо @Pierre, я использовал синхронный вызов с помощью семафоров, но он все еще не работает. (См. метод queryUrl) Я должен добавить, что я очень новичок в разработке Swift и iOS. Это ошибка: [284:19580] TIC TCP Conn Failed [1:0x1c416b340]: 1:50 Err(50) [284:19580] Задача ‹30A63185-9A5A-4F94-ACE7-EC63504C8B05›.‹1› Загрузка HTTP не удалось (код ошибки: -1009 [1:50]) [284:19580] Задача ‹30A63185-9A5A-4F94-ACE7-EC63504C8B05›.‹1› завершена с ошибкой — код: -1009   -  person user3344429    schedule 30.01.2018
comment
Если вы попытаетесь реализовать то, что я сказал, у вас все получится. Попробуйте выполнить запрос на авторизацию, но если он не сработает с указанным выше, верните успешный результат. iOS завершит подключение к SSID и увидит, что ему требуется какая-то аутентификация, команда Authenticate|Maintain будет отправлена ​​снова, второй раз веб-запрос должен работать нормально. Внедрите переключатель, как мой ответ ниже   -  person Pierre    schedule 30.01.2018
comment
Эй, Пьер, когда iOS находится в состоянии аутентификации, таймер обслуживания должен запускаться через 300 секунд. Я думаю, что слишком долго ждать успешной аутентификации. Хотелось бы, чтобы была команда для состояния «Аутентифицировано». developer.apple.com/library/content/documentation/   -  person user3344429    schedule 30.01.2018
comment
Привет, @Pierre, ты использовал задачу данных URLSession для веб-запроса или использовал NWTCPConnection?   -  person user3344429    schedule 31.01.2018
comment
На самом деле я использую Xamarin, но попробуйте NSMutableURLRequest. См. этот developer.apple.com/library/ содержание/документация/   -  person Pierre    schedule 01.02.2018
comment
Спасибо @Pierre, я попробую. Итак, в вашем коде вы заставили веб-запрос работать только в состоянии «Поддерживать» и/или также в состоянии «Аутентификация»?   -  person user3344429    schedule 01.02.2018
comment
В состоянии аутентификации   -  person Pierre    schedule 01.02.2018
comment
ok @Pierre, MutableURLRequest, похоже, устарел.   -  person user3344429    schedule 01.02.2018


Ответы (3)


Я также столкнулся с подобной проблемой. Однако я обнаружил, что разработчику необходимо связать запрос с полученной командой, прежде чем отправлять веб-запрос в подключенную сеть. Все, что вам нужно сделать, это создать NSMutableURLRequest, а затем вызвать hitTestURLRequest.bind(to: command), потому что функция связывания определена в категории NSMutableURLRequest.

person Muhammad Zeeshan    schedule 08.06.2018

Другие сообщали о проблеме с разрешением сервера имен из обратного вызова NEHotspotHelper. Попробуйте использовать IP-адрес для совершения вызова.

Также не забывайте, что URLSession работает асинхронно. Вам нужно будет вызвать response.deliver() только после завершения вызовов веб-службы.

person RajV    schedule 26.01.2018
comment
Привет, @RajV, спасибо. Я попробовал IP-адрес и использовал семафоры для создания синхронного вызова. Это все еще не работает. Я также новичок в Swift. Я по-прежнему получаю следующую ошибку: [284:19580] TIC TCP Conn Failed [1:0x1c416b340]: 1:50 Err(50) [284:19580] Задача ‹30A63185-9A5A-4F94-ACE7-EC63504C8B05›.‹1› Ошибка загрузки HTTP (код ошибки: -1009 [1:50]) [284:19580] Задача ‹30A63185-9A5A-4F94-ACE7-EC63504C8B05›.‹1› завершена с ошибкой — код: -1009 - person user3344429; 30.01.2018

Это просто из этого:

if cmd.commandType
    filterScanList
        - SetConfidence to each of your networks in cmd.networkList - High and add to a local list variable.
        - create Response.Success
        - set Response.NetworkList to your list of confident networks
        ----
        - deliver Response
    Evaluate or PresentUI
        //If it's your network
        - SetConfidence to cmd.network - High
        - create Response.Success
        - set Response.Network to cmd.network
        //If it's not your network
        - create Response.UnsupportedNetwork
        ----
        - deliver Response
    Authenticate or Maintain
        //If it's your network
        - SetConfidence to cmd.network - High
        - create Response.Success
        - set Response.Network to cmd.network
        - TRY AUTHENTICATE HERE SYNCHRONOUSLY
        //If it's not your network
        - create Response.UnsupportedNetwork
        ----
        - deliver Response
    Logoff or None
        - create Response.Success
        ----
        - deliver Response
person Pierre    schedule 26.01.2018