NeHotspotHelper:无法在身份验证状态机的身份验证状态下发送Web请求

时间:2018-01-24 14:47:52

标签: ios authentication captivenetwork captiveportal nehotspothelper

我已经实施了NeHotspotHelper,以便我可以在后台为具有强制网络门户的网络执行身份验证。

我需要在“身份验证”状态下执行Web请求,以便我可以检索Wispr并访问API。

但是,当我尝试使用URLSession发送Web请求时,请求失败。这是错误:

[594:88737] dnssd_clientstub read_all(7)DEFUNCT [594:88783] TIC TCP Conn失败[4:0x1c0177a00]:12:8 Err(-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 个答案:

答案 0 :(得分:1)

我也面临着类似的问题。但是,我发现开发人员需要在向连接的网络发出Web请求之前将请求与收到的命令绑定。您只需要NSMutableURLRequest然后调用hitTestURLRequest.bind(to: command),因为绑定函数是在NSMutableURLRequest类别中定义的。

答案 1 :(得分:0)

这就是它的正确性:

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

答案 2 :(得分:0)

其他人报告了来自NEHotspotHelper回调的名称服务器解析问题。尝试使用IP地址拨打电话。

另请不要忘记URLSession异步工作。只有在Web服务调用完成后才需要调用response.deliver()