如何确定 Wi-Fi 是不是有互联网连接

Posted

技术标签:

【中文标题】如何确定 Wi-Fi 是不是有互联网连接【英文标题】:How to find out if a Wi-Fi is with or without an internet connection如何确定 Wi-Fi 是否有互联网连接 【发布时间】:2021-03-05 05:15:35 【问题描述】:

我想知道 Wi-Fi 是否有互联网连接。有时我们的设备连接了 Wi-Fi,但 Wi-Fi 没有互联网连接。

NWPathMonitor 或第三方连接。我试过了,但它不是万无一失的。

我知道我可以编写一个 ping 服务器的方法,但这是一件非常无效且成本高昂的事情。

有什么想法吗?

【问题讨论】:

嗨@RaviMan,你能向已知的工作网络发出请求,看看它是否回复你吗? @wazowski - 我必须经常检查这个,而且得到结果也可能会有时间延迟。所以我正在寻找即时和来自框架或第三方的东西 好吧,即使您找到的解决方案也需要通过连接检查互联网,因此 ping 到已知服务器就足够了,或者像谷歌这样的快速服务器等... 不是真的想通过 ping 来做 你尝试过Reachability pod吗? 【参考方案1】:

确定网络是否有 Internet 连接的唯一方法是尝试连接到 Internet。设备上没有任何内容可供您查询以获得答案。

即使有它也必须求助于轮询/ping,因为连接可能随时发生变化。

当用户填写热点登录表单时,WiFi 连接可以从无互联网过渡到互联网。如果上游 Internet 连接以某种方式失败,WiFi 连接可以从 Internet 转换为无 Internet。 WiFi 连接可能已连接到 Internet,但由于路由故障或其他问题,无法与您的应用所需的特定主机通信。

出于所有这些原因,Apple 积极反对“飞行前”检查。即使检查通过,网络操作仍然可能由于一微秒后发生的网络状态变化而失败。这也是不必要的开销,因为通常可以安全地假设大多数设备大部分时间都具有某种类型的 Internet 连接,尤其是当设备是 iPhone 时。

无论如何,您都需要处理错误。只需尝试操作,看看会发生什么。如果没有网络连接,它会很快失败。

如果您想向用户提供更多反馈,那么您可以开始主动检查 Internet 连接,并使用指数回退来响应连接错误。

这样您的应用就不会一直“ping”。

您还可以使用该错误启动使用SCNetworkReachability 为您检查连接的进程。与其直接使用该框架,特别是如果您使用 Swift 编写,您可能更喜欢使用一些包装它并使其更易于访问的东西,例如 Ashley Mills 的 Reachability.swift

【讨论】:

您能解释一下“响应连接错误的指数回退”是什么意思吗? 我可以不使用可达性类来检查活动的互联网连接吗? 是的,您可以使用可达性,但它所做的只是定期连接到您指定的主机。它比 ping 稍微好一点,因为它实际上使用的是 http 连接,但 http 连接比 ping 更昂贵。您可以使用可达性来响应网络错误;大多数设备可能有 99% 的时间都具有有效的互联网连接。 指数回退意味着您检查,如果检查失败,您等待,比如说,1 秒并再次检查。如果仍然失败,则等待 2 秒并再次检查,如果仍然失败,则等待 4 秒,依此类推。您可以设置一个上限,这样一旦达到 64 秒,时间段就会停止加倍 创建 ICMP ping 不是简单的代码。我认为使用 Reachabity.Swift 会更好,但指数退避的核心类似于 retryDelay = min(retryDay*2,60)。这将使重试时间加倍,直到达到 60 秒,然后保持在 60 秒

以上是关于如何确定 Wi-Fi 是不是有互联网连接的主要内容,如果未能解决你的问题,请参考以下文章

通过 Wi-Fi Direct 传输文件时是不是可以使用移动数据?

Wi-Fi和VPN同时连接无法访问互联网

可达性转到“Wi-Fi 设置”按钮不起作用

在没有互联网的本地 Wi-Fi 网络中是不是可以进行 Web 通知?

我可以在应用程序中使用 Wi-Fi Direct 和蜂窝数据吗?

Azure 通知适用于移动数据而不是 Wi-Fi