【问题标题】:How can we check whether connected network connection is reachable or not in iOS Swift? [closed]我们如何在 iOS Swift 中检查已连接的网络连接是否可达? [关闭]
【发布时间】:2021-06-17 09:23:25
【问题描述】:

我的应用支持 iOS12 或更高版本,我使用的是最新的 macOS 和 xcode。我对此主题进行了多项研究,但找不到任何合适的解决方案。是的,我知道如何检查我们是否连接到网络并且也可以获取连接类型。但问题是:我连接的网络是否可达?我正在与物联网设备通信,我必须从中获取一些数据,并将其发送到不同的服务器。该设备总是给我数据,因为它是一个内部网,因为我连接到它的热点。我必须检查它是否可以自行将数据进一步发送到另一个远程服务器(有时网络连接不起作用),或者如果不能,我需要将 wifi 连接切换到我的本地网络。我尝试了几种方法,但都没有得到满意的结果。

【问题讨论】:

  • 如果你可以发送 api 请求,它正在工作,否则它不是。为什么你需要事先知道这一点以及“工作”的真正含义是什么,这是一个非常模糊的要求。
  • 我正在与物联网设备通信,我必须从中获取一些数据并将其发送到不同的服务器。该设备总是给我数据,因为它是一个 Intranet,因为我连接到它的热点。我必须检查它是否可以自行将数据进一步发送到另一台服务器(有时网络连接不起作用)或者我需要将 wifi 连接切换到我的本地网络。

标签: ios swift iphone networking


【解决方案1】:

@Joakim Danielson 上面所说的是你应该做的。无论您使用什么来源,它总会在某些时候给您提供虚假信息(关于是否连接到互联网)。

  1. 进行 api 调用。
  2. 检查错误 - 是否是临时网络错误?
  3. 决定是否应该重试或向用户显示其他内容。

如何判断是否是临时网络错误?

您可以在从 api 调用返回的 NSError 实例上使用此扩展。

public extension NSError {
    
    var isConnectionAborted: Bool {
        return (self.domain == NSPOSIXErrorDomain && self.code == 53)
    }
    
    var isTemporaryNetworkError: Bool {
        let temporaryNetworkErrorCodes = [
            NSURLErrorTimedOut,
            NSURLErrorCannotFindHost,
            NSURLErrorCannotConnectToHost,
            NSURLErrorNetworkConnectionLost,
            NSURLErrorDNSLookupFailed,
            NSURLErrorHTTPTooManyRedirects,
            NSURLErrorResourceUnavailable,
            NSURLErrorNotConnectedToInternet,
            NSURLErrorRedirectToNonExistentLocation,
            NSURLErrorSecureConnectionFailed,
            NSURLErrorCannotLoadFromNetwork,
            NSURLErrorRequestBodyStreamExhausted,
        ]
        
        return (self.isConnectionAborted || temporaryNetworkErrorCodes.contains(self.code))
    }
    
    var isCancelled: Bool {
        return (self.domain == NSURLErrorDomain && self.code == NSURLErrorCancelled)
    }

}

我尝试了一个api调用,它失败了,现在我想查询我是否连接到ineternet。怎么知道?

在您的 API 代码中的某处,您可以像这样使用 NWPathMonitor 添加一个观察者来观察可能的网络变化 - 需要 iOS 12

import Network

let monitor = NWPathMonitor()
monitor.start(queue: DispatchQueue(label: "NetworkMonitor"))
monitor.pathUpdateHandler = { (path) in
    if path.status == .satisfied {
        print("Connected")
    } else {
        print("Not Connected")
    }
}

这也允许更精细的控制.cellular.wifi.wiredEthernet 等 -

let cellMonitor = NWPathMonitor(requiredInterfaceType: .cellular)

如果您仍然支持iOS 11,您可以使用第三方库,例如 - Reachability

【讨论】:

    【解决方案2】:

    最佳实践是尝试:调用网络请求并检查结果。如果出现错误,您会做什么取决于您的用例、是否涉及用户或请求是否在后台发出。

    例如,您可能只是输出一个错误并让用户在应用程序中继续。这可能需要相应地设计您的屏幕,即提供一种用户可以重试的方式(在您显示内容的屏幕中,显示一个空的内容屏幕并提供拉动刷新或“重试”按钮等.).

    或者,您可以分析错误的类型(URL 错误或响应错误)并应用多种策略。例如,如果网络请求可以在后台执行,您可以在获得 5xx HTTP 状态时应用重试。或者,如果连接丢失(没有响应并且您收到 URLError),您可能会开始观察网络状态并在网络可用时重试。

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 2013-02-20
      • 2021-09-29
      • 1970-01-01
      相关资源
      最近更新 更多