管理 wifi 可达性变化的正确方法?
The correct way to manage wifi reachability changes?
正在编写一个需要网络的应用程序。 运行 一种检查 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。回到我的应用程序,我在应用程序委托中得到了这个。
func applicationWillEnterForeground(_ application: UIApplication) {
print("applicationWillEnterForeground")
wifiWorks = Reachability.isConnectedToNetwork()
}
这又把我带回来了,所以你不能继续使用这个应用程序,因为它需要 WiFi。
我的问题是,这个舞蹈有意义吗?或者 was/is 有更简洁的方法吗?
您可以使用 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
}
}
另请注意,用户无需离开您的应用即可打开 on/off wifi,只需从控制中心切换 wifi 开关即可。这就是为什么你不应该只依赖 applicationWillEnterForeground
方法。
正在编写一个需要网络的应用程序。 运行 一种检查 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。回到我的应用程序,我在应用程序委托中得到了这个。
func applicationWillEnterForeground(_ application: UIApplication) {
print("applicationWillEnterForeground")
wifiWorks = Reachability.isConnectedToNetwork()
}
这又把我带回来了,所以你不能继续使用这个应用程序,因为它需要 WiFi。
我的问题是,这个舞蹈有意义吗?或者 was/is 有更简洁的方法吗?
您可以使用 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
}
}
另请注意,用户无需离开您的应用即可打开 on/off wifi,只需从控制中心切换 wifi 开关即可。这就是为什么你不应该只依赖 applicationWillEnterForeground
方法。