【问题标题】:Checking Internet Connection in SWIFT在 SWIFT 中检查 Internet 连接
【发布时间】:2020-04-29 09:46:23
【问题描述】:

检查互联网连接的最简单方法是什么?

我找到了这个代码示例,但它是 Xcode11/Swift5 中最有效的方法吗?

在调用从 Internet 下载的函数之前,我只需要在按下按钮时检查连接。所以在调用我的函数之前做一个简单的检查就可以了。这种持续监控是最有效的吗?或者我应该直接在我的按钮按下下使用一些东西。

import Network

class ViewController: UIViewController {

let monitor = NWPathMonitor()
let queue = DispatchQueue(label: "InternetConnectionMonitor")

override func viewDidLoad() {
    monitor.pathUpdateHandler = { pathUpdateHandler in
        if pathUpdateHandler.status == .satisfied {
            print("Internet connection is on.")
        } else {
            print("There's no internet connection.")
        }
    }

    monitor.start(queue: queue)
}

}

【问题讨论】:

  • 除了重复之外,我想提醒您,在用户按下按钮之前总是有机会连接,但是当您实际尝试时它会丢失下载一些东西。由于您的下载代码已经处理了突然的连接丢失情况,我不明白为什么您需要在它之前添加冗余和不可靠的检查。

标签: swift xcode networking connection monitor


【解决方案1】:

我为此使用了 ashleymills 的可达性框架: https://github.com/ashleymills/Reachability.swift

您只需要通过以下方式导入: import ReachabilitySwift

然后在你的视图控制器中你可以做例如:

let reachability = try! Reachability()

if reachability.isReachable {
   print("Internet connection is on.")
}

有关如何使用闭包的更多示例,请参阅 repo 的自述文件。 请注意,它是一个外部框架,可能不是最新的 Swift 版本。

【讨论】:

    【解决方案2】:

    导入系统配置:

    import SystemConfiguration
    

    在 viewController 类之前添加这个类:

    public class Reachability {
    
    class func isConnected() -> Bool {
    
        var noAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
        noAddress.sin_len = UInt8(MemoryLayout.size(ofValue: noAddress))
        noAddress.sin_family = sa_family_t(AF_INET)
    
        let defaultRouteReachability = withUnsafePointer(to: &noAddress) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {noSockAddress in
                SCNetworkReachabilityCreateWithAddress(nil, noSockAddress)
            }
        }
    
        var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
        if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
            return false
        }
    
        let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
        let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
        let ret = (isReachable && !needsConnection)
    
        return ret
    }
    }
    

    现在在 viewDidLoad 检查连接:

    if Reachability.isConnected(){
            print("Internet Connection is ON")
        } else {
            print("Internet Connection OFF")
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2023-03-31
      • 1970-01-01
      • 2013-03-15
      • 2018-10-09
      • 1970-01-01
      相关资源
      最近更新 更多