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