iOS13 立即检查互联网连接
Posted
技术标签:
【中文标题】iOS13 立即检查互联网连接【英文标题】:iOS13 check for internet connection instantly 【发布时间】:2019-12-09 09:02:33 【问题描述】:我声明我是 Swift 和 ios 的新手。 我想了解(在 viewDidLoad 中)我如何在那个时刻立即检查 iPhone 是否已连接到互联网! 新的 NWPathMonitor() 类似乎只对管理连接更改有用,但不适用于即时检查连接。
我的视图控制器
import UIKit
import WebKit
import Network
class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate
// Status bar black characters
override var preferredStatusBarStyle: UIStatusBarStyle return .darkContent
// La nostra webview
var webView: WKWebView!
// NETWORK MONITORING
let monitor = NWPathMonitor()
let queue = DispatchQueue(label: "InternetConnectionMonitor")
var internetConnected = false
// 1 - Eseguita durante il caricamento della view
override func loadView()
super.loadView()
// WEB VIEW
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
// NETWORK MONITORING
monitor.pathUpdateHandler = path in
if path.status == .satisfied
print("dedalos-print INTERNET OK 1")
if (!self.internetConnected)
self.internetConnected = true
self.loadWebView()
else
print("dedalos-print NO INTERNET 1")
self.internetConnected = false
self.loadhtmlerror()
monitor.start(queue: queue)
// 2 - Eseguita dopo il caricamento della view
override func viewDidLoad()
super.viewDidLoad()
if (self.internetConnected)
print("dedalos-print INTERNET OK 2")
self.loadWebView()
else
print("dedalos-print NO INTERNET 2")
// 3 - Eseguita poco prima di mostrarsi
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
// 4 - Eseguita dopo essersi mostrata
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
override func viewWillDisappear(_ animated: Bool)
super.viewWillDisappear(animated)
提前致谢!
【问题讨论】:
github.com/ashleymills/Reachability.swift 使用这个 pod。 签出此github.com/ashleymills/Reachability.swift 谢谢@KeshuRai 和@Chris!它似乎工作! 【参考方案1】:如果您不想使用第三方库。
创建NetworkCheck
类:
import Network
protocol NetworkCheckObserver: class
func statusDidChange(status: NWPath.Status)
class NetworkCheck
struct NetworkChangeObservation
weak var observer: NetworkCheckObserver?
private var monitor = NWPathMonitor()
private static let _sharedInstance = NetworkCheck()
private var observations = [ObjectIdentifier: NetworkChangeObservation]()
var currentStatus: NWPath.Status
get
return monitor.currentPath.status
class func sharedInstance() -> NetworkCheck
return _sharedInstance
init()
monitor.pathUpdateHandler = [unowned self] path in
for (id, observations) in self.observations
//If any observer is nil, remove it from the list of observers
guard let observer = observations.observer else
self.observations.removeValue(forKey: id)
continue
DispatchQueue.main.async(execute:
observer.statusDidChange(status: path.status)
)
monitor.start(queue: DispatchQueue.global(qos: .background))
func addObserver(observer: NetworkCheckObserver)
let id = ObjectIdentifier(observer)
observations[id] = NetworkChangeObservation(observer: observer)
func removeObserver(observer: NetworkCheckObserver)
let id = ObjectIdentifier(observer)
observations.removeValue(forKey: id)
然后在您的ViewController
中,您可以检查网络变化。
import Network
class ViewController: UIViewController,NetworkCheckObserver
var networkCheck = NetworkCheck.sharedInstance()
override func viewDidLoad()
super.viewDidLoad()
if networkCheck.currentStatus == .satisfied
//Do something
else
//Show no network alert
networkCheck.addObserver(observer: self)
func statusDidChange(status: NWPath.Status)
if status == .satisfied
//Do something
else if status == .unsatisfied
//Show no network alert
【讨论】:
我正在测试这个解决方案,但在这种情况下它失败了,将你的模拟器连接到 wifi 网络,然后在你的 mac 中关闭 Wi-Fi 你会得到状态 == .unsatisfied 这很好但是如果你打开Wi-Fi 再次打开,然后您再次获得状态 == .unsatisfied 并且状态 == .satisfied 从未到达。 @AlejandroUribeSánchez 我也有同样的问题,你解决了吗? 从我读到的内容来看,NWPathMonitor 在模拟器上很不稳定,这对于 Apple 来说真的是一种耻辱和糟糕的举动。 NetworkCheck 是最好的解决方案,请忘记可达性【参考方案2】:试试 Apple 的Reachability。它将直接向您获取连接状态。
guard let r = Reachability("https://www.apple.com") else return
if r.connectionRequired()
// connection required
return
switch r.currentReachabilityStatus()
case NotReachable:
// Not Reachable
break
case ReachableViaWWAN, ReachableViaWiFi:
// Reachable!!
break
default:
break
【讨论】:
好像只到iOS12有效,我在为iOS13+工作 @Stefano 否。它适用于 iOS 13。我刚刚测试过 啊,好的,非常感谢!但我认为会被弃用...medium.com/@rwbutler/… @Stefano 它不会。 Apple 的可达性类使用 SystemConfiguration 框架中的 API。我猜它在未来几年内不会被弃用。 NWPathMonitor 只是一种检测连接性的现代方式。 这是objective-c,我想要一个快速的解决方案。【参考方案3】:您也可以查看是否可以使用getaddrinfo
解析位置
#if os(macOS)
import Cocoa
#else
import Foundation
#endif
func reachable(host: String) -> Bool
var res: UnsafeMutablePointer<addrinfo>?
let n = getaddrinfo(host, nil, nil, &res)
freeaddrinfo(res)
return n == 0
var isConnectedToInternet: Bool reachable(host: "apple.com")
print("Connected to internet: \(isConnectedToInternet)")
【讨论】:
以上是关于iOS13 立即检查互联网连接的主要内容,如果未能解决你的问题,请参考以下文章