NEHotspotConfigurationManager нет ошибки для неверного пароля /SSID
Когда я использую NEHotspotConfigurationManager
чтобы подключиться к точке доступа WiFi, и я намеренно использую неверный пароль или SSID, я не получаю ожидаемого программного отклика. Пользователь получает обратную связь о том, что соединение не удалось через оповещение, но в блоке завершения, предоставленном apply
функция, error
равно нулю, так же, как в случае успеха. Это лишает меня возможности различать случаи успеха и неудачи. NEHotspotConfigurationError
имеет оба .invalidSSID
а также .invalidWPAPassphrase
, Я ожидаю, что они будут возвращены вместо. Для меня это похоже на радар, но я хотел бы сначала получить некоторую обратную связь.
NEHotspotConfigurationManager.shared.removeConfiguration(forSSID: "test")
let configuration = NEHotspotConfiguration(ssid: "test", passphrase: "testasdasd", isWEP: false)
configuration.joinOnce = true
NEHotspotConfigurationManager.shared.apply(configuration) { (error) in
// error is nil
}
2 ответа
Похоже, что после подачи радара в Apple этот API работает так, как задумано. Случай успеха / неудачи относится только к применению конфигурации горячей точки.
Хорошей новостью является то, что я нашел подходящее решение для этого в использовании CNCopySupportedInterfaces
чтобы проверить, действительно ли приложение подключено к SSID, оно заявило, что оно это сделало.
let ssid = "test"
NEHotspotConfigurationManager.shared.removeConfiguration(forSSID: said)
let configuration = NEHotspotConfiguration(ssid: ssid, passphrase: "testasdasd", isWEP: false)
configuration.joinOnce = true
NEHotspotConfigurationManager.shared.apply(configuration) { (error) in
if let error = error as NSError? {
// failure
} else {
if self.currentSSIDs().first == ssid {
// Real success
} else {
// Failure
}
}
}
Используя эту функцию, как определено ниже:
func currentSSIDs() -> [String] {
guard let interfaceNames = CNCopySupportedInterfaces() as? [String] else {
return []
}
return interfaceNames.flatMap { name in
guard let info = CNCopyCurrentNetworkInfo(name as CFString) as? [String:AnyObject] else {
return nil
}
guard let ssid = info[kCNNetworkInfoKeySSID as String] as? String else {
return nil
}
return ssid
}
}
Неверный логин с неверным паролем все еще является проблемой для этого API. Если вы уже подключены к ssid, вы всегда получаете "уже связанный" с хорошим или плохим паролем, введенным в вызов. Единственный способ работы вышеуказанной логики - если вы измените существующий ssid на другой действующий существующий ssid и передадите ему неверный пароль, то приведенная выше логика перехватит неверный пароль. Использование removeConfiguration для данного ssid, похоже, не имеет никакого эффекта.