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, похоже, не имеет никакого эффекта.

Другие вопросы по тегам