10

所以我试图通过关闭器来监控连接状态:

 func reconnect(success: @escaping () -> Void, failure: @escaping () -> Void) {
    let manager = NEHotspotConfigurationManager.shared
    let ssid = CameraManager.camera.uuid
    let password = "password"
    let isWEP = false
    let hotspotConfiguration = NEHotspotConfiguration(ssid: ssid, passphrase: password, isWEP: isWEP)
    hotspotConfiguration.joinOnce = true
    manager.apply(hotspotConfiguration) { (error) in
        if (error != nil) {

          if let error = error {
                switch error._code {
                case 8:
                    print("internal error")
                    failure()
                case 7:
                    NotificationCenter.default.post(name: Notification.Name(rawValue: "cancelFromHotSpot"), object: nil)
                    failure()
                    self.stopSession()
                case 13:
                    success()
                    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
                        self.startSession()
                    }
                default:
                    break
                }
        }

        if error == nil {
            print("success connecting wifi")
            success()
            DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
                self.startSession()
            }
        }
    }
}

然而,在错误为零的情况下,我收到此警报“无法加入网络”,有什么想法吗?

4

2 回答 2

8

我认为这种行为是一个 iOS 错误,我们无法避免。

苹果开发者论坛也讨论过这个问题,苹果工作人员的回答如下

“除了我在 2 月 13 日所说的话之外,我没有什么要说的了。Wi-Fi 子系统的错误不会通过完成处理程序报告这一事实是预期的行为。如果你不喜欢这种行为 - 并且,要明确一点,我个人同意你的看法——最好的方法是提交一份错误报告,要求更改它。请张贴你的错误编号,以作记录。”

这在这里讨论过

所以很遗憾,我没有什么好主意。我的所有想法都在下面两个(这些并不能完美地解决这个问题。)

  1. 等待未来版本中的错误修复。
  2. 将“应用配置”代码和通信代码分开,如下所示。
@IBAction func setConfigurationButtonTapped(_ sender : Any) {
    manager.apply(hotspotConfiguration) { (error) in
    if(error != nil){
        // Do error handling
    }else{
        // Wait a few seconds for the case of showing "Unable to join the..." dialog.
        // Check reachability to the device because "error == nil" does not means success.
    }
}
@IBAction func sendButtonTapped(_ sender : Any) {
    self.startSession()
}
于 2019-01-29T13:56:39.233 回答
3

iOS 13 - 补丁

我有同样的问题,但我通过首先删除所有现有的配置条目来解决它:

NEHotspotConfigurationManager.shared.getConfiguredSSIDs { (wifiList) in
    wifiList.forEach { NEHotspotConfigurationManager.shared.removeConfiguration(forSSID: $0) }
    // ... from here you can use your usual approach to autoconnect to your network
}

也许这并不总是一个可能的解决方案,因为它有点激烈,但对我来说就像一个魅力。

PS:我在运行 iOS 13 的应用程序中使用它。据我所知,它也应该适用于 iOS 11 和 12,但我没有测试它。

于 2019-10-07T11:52:06.297 回答