Reachability.swift: 即使主机无效也可访问

创建于 2016-09-06  ·  4评论  ·  资料来源: ashleymills/Reachability.swift

我正在查看 ReachabilityTests 并注意到,至少对我来说,使用无效主机时得到了意想不到的结果。

以下代码片段:

        let reachability: Reachability
        let invalidHostName = "invalidhost2342342344.foobar.fubble"

        do {
            try reachability = Reachability(hostname: invalidHostName)
            print (reachability.currentReachabilityStatus)
        } catch {
            XCTAssert(false, "Unable to create reachability")
            return
        }

对我来说,打印语句返回“WiFi”

如果我运行实际的单元测试,我会收到“无效的主机名应该永远无法访问”错误。

有没有其他人遇到过这种情况?

除非我做错了什么,否则这似乎是一个很大的问题。

谢谢!

Investigate question

所有4条评论

我的 testInvalidHost 单元测试也得到了这个......

` let invalidHostName = "invalidhost_chachacha"

    guard let reachability = Reachability(hostname: invalidHostName) else {
        XCTAssert(false, "Unable to create reachability")
        return
    }

    let aExpectation = expectation(description: "Check invalid host")
    reachability.whenReachable = { reachability in
        DispatchQueue.main.async {
            XCTAssert(false, "\(invalidHostName) should never be reachable - \(reachability))")
        }
    }

`

XCTAssertTrue failed - invalidhost_chachacha should never be reachable

你好@ashleymills ,有什么更新吗? (我与@toddhopkinson 的单元测试几乎相同。)

我遇到了完全相同的问题。 无效主机被报告为“.wifi”。

上面的例子对我来说也非常有效,但我会添加我的。

guard let reachability = Reachability(hostname: "invalid.placeontheinternet.com") else {
    completion?(false)
    return
}
reachability.whenReachable = { (status) in
    print("reachable? \(status.connection)")
}
reachability.whenUnreachable = { (status) in
    print("unreachable")
}

do {
    try reachability.startNotifier()
} catch { // notify
    completion?(false)
}

不幸的是,这不是这个库中的失败,它实际上是 SCNreachability(这个框架使用的)如何定义某些东西是否可达的问题。 来自苹果文档:

SCNetworkReachability 编程接口允许应用程序确定系统当前网络配置的状态和目标主机的可达性。 当应用程序发送到网络堆栈的数据包可以离开本地设备时,远程主机被认为是可达的。 可达性并不能保证数据包真的会被主机接收。

因此,如您所见,如果主机无效,对于该库(以及任何其他使用 SCNNetworkReachability 框架的库),它仍然可以“访问”,因为数据包可以离开设备。 只有另一端没有应答。

在这种情况下,我的解决方案是进行两个测试:使用此库(或任何其他使用 SCNNetworkReachability)的“本地可达性测试”和使用 Swify 中的 ping 的“远程可达性测试”(对主持人)。

将两者结合起来,您可以判断来自设备的连接是否已关闭(如果两个测试均失败)或主机是否无效、已关闭或无法访问(本地可达性通过但远程可达性失败)。

希望能帮助到你!

此页面是否有帮助?
0 / 5 - 0 等级