6

当我使用NEHotspotConfigurationManager连接到 WiFi 接入点时,我故意使用无效的密码或 SSID,我没有得到我期望的程序反馈。用户通过警报收到连接失败的反馈,但在提供给apply函数的完成块中,error为 nil,与成功案例相同。这使我无法区分成功和失败的案例。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
}
4

2 回答 2

16

在向 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
    }
}
于 2018-02-07T20:22:11.600 回答
0

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

于 2018-08-06T17:09:56.593 回答