NEHotspotConfigurationManager对于无效密码/ SSID

时间:2018-02-07 17:35:09

标签: ios swift wifi networkextension nehotspothelper

当我使用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 个答案:

答案 0 :(得分:8)

在向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
    }
}

答案 1 :(得分:0)

此密码上的问题仍然是密码错误的无效登录。如果您已经连接到ssid,则始终会在呼叫中使用好密码或坏密码“已关联”。上面的逻辑唯一可行的方法是,如果您从一个现有的ssid更改为另一个有效的现有的ssid并向其传递一个错误密码,那么上述逻辑将捕获该错误密码。对给定的ssid使用removeConfiguration似乎无效。