NeHotspotHelper: не удалось отправить веб-запрос в состоянии проверки подлинности конечного автомата проверки подлинности

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

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

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

[594: 88737] dnssd_clientstub read_all (7) DEFUNCT [594: 88783] TIC TCP Conn Failed [4: 0x1c0177a00]: 12: 8 Ошибка (-65554) [594:88783] Задача.<1> Ошибка загрузки HTTP (код ошибки: -1003 [12:8]) [594:88783] Задание.<1> завершено с ошибкой - код: -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)

    }

3 ответа

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

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

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

Это как раз из этого:

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
Другие вопросы по тегам