@Joakim Danielson 上面所说的是你应该做的。无论您使用什么来源,它总会在某些时候给您提供虚假信息(关于是否连接到互联网)。
- 进行 api 调用。
- 检查错误 - 是否是临时网络错误?
- 决定是否应该重试或向用户显示其他内容。
如何判断是否是临时网络错误?
您可以在从 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