如何使用 swift 4 测试 iPhone 互联网连接?

How to test for iPhone connection to internet with swift 4?

对于Swift4/xcode:
我已经在互联网上搜索过这个问题的解决方案,但我还没有找到涵盖所有基础的明确、全面的答案。 Stack上有几个在一定程度上回答了这个问题,包括swift个具体的答案比如 or AshleyMills Reachability,但是很多都是老的,不全面
1. 我希望方法检查 互联网连接 ,而不是 连接到 wifi。一些在线方法仅检查是否连接到 Wi-Fi,但不确认是否可以通过 wifi 上网。我想要一种方法,如果检测到互联网连接, return为真。
2. 对于蜂窝数据使用,此方法必须 also return 为真。是的,Wi-Fi 可以提供互联网连接,但数据也可以。如果提供其中一个或两个 cellular/wifi 互联网,此方法需要足够全面才能 return 为真。
最后,一个注意事项。事实上,在线上没有完整的 swift 答案来勾选所有的框,这让我想知道我对这个问题的处理方法是否在更一般的意义上是不正确的。我的应用程序需要从数据库加载数据,这就是它需要互联网连接的原因。对于当今流行的应用程序来说,这是一件极其普遍的事情。应用程序不会因尝试在没有互联网连接的情况下加载数据而崩溃。我认为他们所做的(这是这个问题的基础)是这样的:

if doesHaveInternetConnection{
    //run loading data functions
}else{
    //don't run loading data functions
}

不就是这样吗?如果没有,解决这个问题的更好方法是什么?

Here是网络请求时的URLError列表。在列表中,有一个名为 notConnectedToInternet 的枚举值。当您发出网络请求失败时,请查看错误代码以确定是由于未连接还是其他原因造成的。

或者,您可以在您的服务器上托管一个 health-check 端点。在发出任何请求之前,请向此端点发出请求。如果请求成功,您可以放心,互联网连接正常。不过,我强烈建议您选择第一个选项。

例子

注意:下面的代码在Swift 3.

URLSession.shared.dataTask(with: *URLRequest*) { (data, response, error) -> Void in
    if error != nil {
        if let e = error as? URLError, e.code == .notConnectedToInternet {
            //Not connected to internet
        } else {
            //Some other error
        }
    } else {
        //The request was successful
    }
}.resume()

使用 Alamofire 检查互联网,在 Swift 4

import Foundation
import Alamofire

class Connectivity {

   class func isConnectedToInternet() ->Bool {
        return NetworkReachabilityManager()!.isReachable
   }
}

然后调用这个函数

if Connectivity.isConnectedToInternet() {
    print("Yes! internet is available.")
    // do some tasks..
}