NEHotspotConfigurationManager нет ошибки из-за неверного пароля / SSID

Когда я использую NEHotspotConfigurationManager для подключения к точке доступа Wi-Fi и намеренно использую неверный пароль или 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
}

person Kyle Redfearn    schedule 07.02.2018    source источник


Ответы (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
    }
}
person Kyle Redfearn    schedule 07.02.2018
comment
Это хорошая информация, для XCode 10 убедитесь, что у вас установлены права доступа AccessWiFi, тогда только вы сможете получить доступ к имени SSID. - person Nilesh; 03.07.2018
comment
currentSSIDs (). first возвращает ноль, несмотря на то, что он подключен. - person Yogee; 06.08.2020
comment
Добавьте платформу SystemConfiguration в библиотеки ссылок и импортируйте SystemConfiguration.CaptiveNetwork - person Yogee; 06.08.2020

Недействительный логин с неверным паролем по-прежнему является проблемой для этого API. Если вы уже подключены к SSID, вы всегда получаете сообщение «уже связано» с хорошим или плохим паролем, указанным в вызове. Вышеупомянутая логика работает только в том случае, если вы перейдете с существующего ssid на другой действующий существующий ssid и передадите ему неверный пароль, тогда вышеуказанная логика перехватит неверный пароль. Использование removeConfiguration для данного ssid, похоже, не имеет никакого эффекта.

person Frost    schedule 06.08.2018