您如何在移动 safari 上检测 3G 与 Wifi 连接?

Posted

技术标签:

【中文标题】您如何在移动 safari 上检测 3G 与 Wifi 连接?【英文标题】:How do you detect 3G vs. Wifi connection on mobile safari? 【发布时间】:2012-01-25 18:02:19 【问题描述】:

我专门询问移动网页上的 javascript,而不是 Objective-C 应用程序。是否有类似 Apple Reachability for javascript 这样我可以判断 Edge、3G 或 Wifi 连接何时建立或更改?

【问题讨论】:

【参考方案1】:

除非浏览器开始通过 DOM 提供这些信息,但目前它们还没有。有一个navigator javascript 对象,其中包含许多东西,但不是您要寻找的东西。我最近还在新闻中看到,一些蜂窝运营商正在将 cookie 添加到他们手机上发出的 HTTP 请求中。他们被发现将客户 ID 添加到 cookie 中(严重的安全漏洞!!)。

Mobile Safari 确实添加了一些新的 DOM additions,但不是您想要的。

缺少这些选项,你不能。互联网协议层旨在封装和隐藏底层的细节。您无法检测 Edge、3G 或 Wifi,就像您无法检测电缆、DSL 或更精细的光学器件一样。

最后,即使您可以获得此信息,除非您拥有 TCP 连接中每个节点的详细信息,否则对您没有任何好处。例如,我可以有以下设置:

iPad ---WiFi---> iPhone 的热点---3G---> 运营商---未知--->>>

附录

在 2012-2013 年,W3C 充实了The Network Information API,旨在提供“Web 应用程序访问设备底层连接信息的接口”。 At the time,API 规定浏览器的“估计”带宽可通过navigator.connection.bandwidth 获得。 自 2014 年 4 月起,该工作已停止!

更新 1:自 2015 年 10 月 20 日起,此 API 的工作仍在继续。您可以在 W3C 的 github 页面上找到最新的Editor's drafts for the Network Information API。

更新 2: 2020 年 6 月,Apple declined to implement the Network Information API in Safari due to privacy concerns

【讨论】:

绝对有用,尤其是下载资产。如果我知道我的产品有 wifi 连接,我很乐意将它们的屏幕截图发送到移动设备 @Jason,知道下载速度以便发送正确大小的资源会很有用,是的!但是端点上的“Wi-Fi 连接”并不意味着您的连接中没有速度较慢的节点。例如。我的 iPad 连接到 wifi 网络,我手机的热点……但我的手机只有 3G 上网。那只是2跳。你的服务器和用户代理之间有多少次跳转?! 这很公平,我想。带宽速率将是理想的,但在没有它的情况下,连接类型将使我能够做出比可用的更好的猜测。 “4G”总是会比“3G”快,而且大多数时候“WiFi”都比这两者都快。它并不总是正确的,但话又说回来,GPS 并不总是正确的,我们仍然依赖它,对吧? ;) @Jason,我想可以通过异步 JavaScript 调用下载已知大小的资源并测量传输所需的时间。这将获得手头连接的实际指标。我只是不喜欢假设某个连接可以保证一定的带宽速度……但我理解其背后的原因。 :)【参考方案2】:

尽管您无法使用来自浏览器的数据来检测用户是在使用 Wifi 还是蜂窝连接 - 捕获用户的 IP 可能是区分 Wifi 和蜂窝连接的一种方法。

在这篇关于蜂窝网络如何影响您的 IP 地址 (http://clas-s-room.synonym.com/wifi-change-ip-17586.html) 的文章中,它陈述了以下内容:

在使用 Wi-Fi 时,您设备的公共 IP 将与您网络上的所有其他计算机匹配,并且您的路由器会分配一个本地 IP。在使用蜂窝连接时,您的蜂窝运营商会分配一个公共 IP。连接到蜂窝互联网不使用路由器,因此您的设备不会有本地 IP。

如果 ip = localIp,则连接 = wifiConnection

如果 ip = publicIp,则连接 = 蜂窝连接

这是我使用蜂窝网络时的 IP 屏幕截图:

这是我在 Wifi 上的 IP(关闭蜂窝网络后)的屏幕截图:

这可能是在没有浏览器帮助的情况下解决问题的一种方法。

【讨论】:

kooto 给你,我刚刚学到了一些非常有价值的信息。 我认为这是因为您从电话提供商那里获得了 ipv6 地址。 ipv6 不使用路由器。当我使用 4G 时,我得到一个 ipv4 地址,并且没有区别【参考方案3】:

目前此限制已得到改善,但在不同浏览器(移动或非移动设备)中支持的网络信息 API 仍有限制,https://caniuse.com/#search=network

如果这对您有帮助,在我们的案例中,由于我们的特定移动应用程序是混合的,并且使用 Ionic 开发,我们已经能够使用这个 cordova 插件在 iO 或 android 上完成它:https://github.com/apache/cordova-plugin-network-information,它就像一个魅力。

【讨论】:

以上是关于您如何在移动 safari 上检测 3G 与 Wifi 连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测移动到 Mobile Safari 中的新选项卡

当用户使用 3G 时如何停止 iCloud 同步和备份

如何检测没有 chrome 的移动 safari?

是否可以在移动 Safari 中检测邮政地址,以便将其添加到联系人中?

如何强制网络位置?

您如何在桌面和移动 Chrome 用户代理之间进行检测?