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 立即检查互联网连接的主要内容,如果未能解决你的问题,请参考以下文章

检查互联网连接 - iOS 逻辑 [重复]

如何在 iOS 设备上检查互联网连接? [复制]

检查互联网连接 iOS - Obj-C

检查 iOS 上的互联网连接会引发错误

检查互联网连接一段时间

在检查互联网连接期间 iOS 应用程序冻结