NEHotspotConfigurationManager 没有错误 password/SSID

NEHotspotConfigurationManager no error for invalid password/SSID

当我使用 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
}

向 Apple 提交雷达后,API 似乎按设计工作。 success/failure案例仅适用于热点配置的应用。

好消息是,我找到了一个合适的解决方法,即使用 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,您总是会收到 'already associated' 并在通话中设置好或坏的密码。上述逻辑工作的唯一方法是,如果您从现有 ssid 更改为另一个有效的现有 ssid 并向其传递错误密码,则上述逻辑将捕获错误密码。对给定的 ssid 使用 removeConfiguration 似乎没有效果。