ios - 管理 wifi 可达性变化的正确方法?

标签 ios swift connection wifi reachability

编写需要网络的应用程序。运行一个方法来检查 WiFi 是否打开并工作,最初是在 ViewController 中。所以我得到了...

wifiWorks = Reachability.isConnectedToNetwork()

这是这样定义的...

var wifiWorks: Bool = false {
  didSet {
    if wifiWorks {
        print("Wifi On")
        NotificationCenter.default.post(name: Notification.Name("WifiBon"), object: nil, userInfo: nil)
    } else {
        print("WiFi Off")
        NotificationCenter.default.post(name: Notification.Name("noWiFi"), object: nil, userInfo: nil)
    }
  }
}

现在,如果 noWifi 被调用,它会显示一条警报,基本上会转到这样的设置...

 func noWifi(notification:NSNotification) {
    DispatchQueue.main.async {
        //self.navigation.isHidden = true 
        let alert = UIAlertController(title: "Stop", message: "Your iPad isn't connected to the WiFi ...", preferredStyle: UIAlertControllerStyle.alert)
        let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
            guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
                return
            }

            if UIApplication.shared.canOpenURL(settingsUrl) {
                UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                    print("Settings opened: \(success)") // Prints true
                })
            }
        }
        alert.addAction(settingsAction)
        let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
        alert.addAction(cancelAction)
        self.present(alert, animated: true, completion: nil)
    }
}

此时,我的应用程序不再运行,用户正坐在设置中,并且必须切换回我的应用程序(希望)打开 WiFi。回到我的应用程序,我在应用程序委托(delegate)中得到了这个。

func applicationWillEnterForeground(_ application: UIApplication) {
    print("applicationWillEnterForeground")
    wifiWorks = Reachability.isConnectedToNetwork()
}

这又把我带回来了,所以你不能继续使用这个应用程序,因为它需要 WiFi。

我的问题是,这个舞蹈有意义吗?或者是否有更简洁的方法来做到这一点?

最佳答案

您可以使用 Reachability 自己的通知,因为它是 GitHub page建议:

NotificationCenter.default.addObserver(self, selector: #selector(self.reachabilityChanged),name: ReachabilityChangedNotification,object: reachability)

do{
  try reachability.startNotifier()
}catch{
  print("could not start reachability notifier")
}

回调:

func reachabilityChanged(note: NSNotification) {
    let reachability = note.object as! Reachability
    if !reachability.isReachable {
        //you can show alert here
    }
}

另请注意,用户无需离开您的应用即可打开/关闭 wifi,只需从控制中心切换 wifi 开关即可。这就是为什么您不应该只依赖 applicationWillEnterForeground 方法。

关于ios - 管理 wifi 可达性变化的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40029456/

相关文章:

java - 通过 Java 中的按钮关闭数据库连接

ios - 使用静态单元格在 UITableViewController 上添加按钮覆盖

objective-c - objective-c : How do i smoothen the brush like a real brush?

ios - UINavigationController 对底下的 UITableView 透明

ios - 转发 UIScrollViewDelegate 调用时出现问题

ios - 使用 webView 在 iOS 中集成 Instagram 失败

ios - .enforceQoS 标志如何提高优先级?

ios - 使用快速语言在NSMutableURLRequest URL中引起日期字符串错误

python - MySQLdb 连接问题

java - Class.forName() 在尝试使用 HiveDriver 时给出 Classnotfound 异常