【问题标题】:Checking for internet connection or wifi connection with reachabilitySwift使用reachabilitySwift检查互联网连接或wifi连接
【发布时间】:2018-02-02 02:11:45
【问题描述】:

我正在构建一个 iOS 应用程序,有时我需要检查应用程序对互联网的访问,所以我使用了 ReachabilitySwift 库。

经过一些测试,在我看来,图书馆只检查设备是否连接了 wifi,而没有从我的路由器提供实际的互联网连接。

假设我断开了路由器与互联网的连接,如果我的 iOS 设备通过 wifi 连接到路由器,可达性告诉我我们有互联网连接,而实际上我的路由器没有互联网。

我尝试了使用特定主机的可达性,但结果仍然相同

var reachability = Reachability.init(hostname: "google.com");

当 wifi 连接丢失或实际互联网连接丢失时,可达性库是否应该提供反馈?

提前谢谢你。

【问题讨论】:

标签: ios swift reachability reachability-swift


【解决方案1】:

我在对受 VPN 保护的网络进行 Web 服务调用时遇到了类似的可达性问题。

var reachability = Reachability.init(hostname: "google.com"); 对我不起作用,因为它在有 Wifi 连接时返回 true。

当对服务器进行虚拟调用时,我使用了Alamofire 响应

func networkIsAvailable(available: (Bool, String?) -> Void) {

        var message : String = ""
        DispatchQueue.main.async {
            HUD.show(.progress)
            Alamofire.request(Constants.baseUrl, method: .get, parameters: ["foo": "bar"])
            .responseJSON(completionHandler: { (response) in
                let error = response.result.error as? NSError
                if error?.localizedDescription == networkAlert {
                    message = networkAlert
                    available(false, message)

                } else if error?.code == cannotConnectServerCode || error?.localizedDescription == cannotConnectServerMessage {
                    message = cannotConnectServerMessage
                    available(false, anotherNetworkAlert)

                } else {
                    available(true, nil)
                }
            })
        }
    }

【讨论】:

  • 我想这是我想走的路
【解决方案2】:

在 WWDC 上,Apple 多次表示,如果您需要简单地查看 WiFi 或蜂窝是否已启动,请使用 Reachable。如果您需要查看是否可以连接 - 那就不要使用 Reachable;而是简单地连接并处理错误。

Reachable 实际上并没有检查它是否可以连接到基于 IP 的资源,以及是否要返回结果。做到这一点的唯一方法就是实际尝试。

在 Apple 的 WWDC 网站上查找与 Quinn 的交流会,以查看相同的建议。

【讨论】:

  • 感谢您实际解决最初的问题 :) 您能否参考演讲视频,甚至是一些官方文件?
【解决方案3】:

Reachablility.h 中可以找到声明:

typedef enum : NSInteger {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableViaWWAN
} NetworkStatus;

然后,在Reachability 类中,你可以找到返回类型的方法:

- (NetworkStatus)currentReachabilityStatus;

所以,使用它。在您的 swift 代码中,您可以这样做:

if reachability.currentReachabilityStatus == .ReachableViaWiFi {
    // Do things...
}

【讨论】:

  • 谢谢,但就像我一直在说的那样,我已经完成了所有这些,我的问题是确认可达性库仅检查是否有 wifi 连接,而不是实际检查是否有实际的互联网通过该 wifi 连接访问。
  • 如果不能上网,你会得到NotReachable,还是我错了?
  • 这正是我的问题,当我断开我的路由器并将我的 ios 设备连接到我的路由器时,我不断获得 ReachableViaWiFi,就好像库只检查设备是否通过 wifi 连接到路由器而不是检查互联网连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多