iOS13 立即检查互联网连接

标签 ios swift iphone wkwebview


我声明我对 Swift 和 iOS 总体来说还是个新手。
我想了解(在 viewDidLoad 中)如何立即检查 iPhone 是否已连接到互联网!
新的 NWPathMonitor() 类似乎仅适用于管理连接更改,但不适用于即时检查连接。

我的 View Controller

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)
    }


}

提前致谢!

最佳答案

如果您不想使用第三方库。

创建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
        }
    }
    }

关于iOS13 立即检查互联网连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59245501/

相关文章:

ios - 在 InterfaceBuilder 中启用/禁用 NSLayoutConstraints

ios - 如何根据构建配置将命令行参数传递给 Xcode

ios - 是否可以暂停 CAEmitterLayer?

ios - 在 UITableView 中带导航的 UITableView

iphone - 如何将文本的第一个字母大写

ios - 使用 ObjC RestKit 库如何将对象映射到 JSON NSString *

php - AFNetworking 将 UIImage 上传为 NSData -> PHP 脚本移动文件

ios - 在 UITableViewCell 中调用 UIAlertController

ios - 如何在 UITableViewController 中使用 UIPickerView

iphone - 处理图像时的 iOS 设置进度条值