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

如何使用swift 4测试iPhone与互联网的连接?,swift,reachability,reachability-swift,Swift,Reachability,Reachability Swift,对于Swift 4/xcode: 我已经在互联网上搜寻这个问题的解决方案,但我还没有找到一个涵盖所有基础的明确、全面的答案。在某种程度上,有几种现成的答案可以回答这个问题,包括像or这样的swift特定答案,但许多都是陈旧的,不全面的。 1.我想要的方法是检查互联网连接,而不仅仅是wifi连接。有几种在线方法只是检查是否连接到Wi-Fi,但并不确认是否可以通过wifi上网。我想要一个只有在检测到internet连接时才返回true的方法。 2.对于蜂窝数据使用,此方法也必须返回true。是的,W

对于Swift 4/xcode:
我已经在互联网上搜寻这个问题的解决方案,但我还没有找到一个涵盖所有基础的明确、全面的答案。在某种程度上,有几种现成的答案可以回答这个问题,包括像or这样的swift特定答案,但许多都是陈旧的,不全面的。
1.我想要的方法是检查互联网连接,而不仅仅是wifi连接。有几种在线方法只是检查是否连接到Wi-Fi,但并不确认是否可以通过wifi上网。我想要一个只有在检测到internet连接时才返回true的方法。
2.对于蜂窝数据使用,此方法也必须返回true。是的,Wi-Fi可以提供互联网连接,但数据也可以。如果同时提供蜂窝/wifi网络或其中之一,则此方法需要足够全面,以返回true。
最后,请注意。事实上,网上没有一个完整的快速答案来检查所有的方框,这让我怀疑我对这个问题的处理方法在更普遍的意义上是否是错误的。我的应用程序需要从数据库加载数据,这就是它需要互联网连接的原因。这对于当今流行的应用程序来说是非常常见的事情。应用程序不会因为在没有互联网连接的情况下加载数据而崩溃。我认为他们所做的(这是这个问题的基础)是这样的:

if doesHaveInternetConnection{
    //run loading data functions
}else{
    //don't run loading data functions
}
难道不是这样吗?如果没有,解决此问题的更好方法是什么?

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

或者,您可以在服务器上托管一个
运行状况检查
端点。在提出任何请求之前,向该端点提出请求。如果请求成功,您可以放心,您可以连接到internet。尽管如此,我还是强烈建议您选择第一个选项

示例

注:以下代码为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()
是发出网络请求时的
URLError
s列表。在列表中,有一个名为
notconnectedpointernet
的枚举值。当您发出网络请求但失败时,请查看错误代码以确定是否是由于没有连接或其他原因造成的

或者,您可以在服务器上托管一个
运行状况检查
端点。在提出任何请求之前,向该端点提出请求。如果请求成功,您可以放心,您可以连接到internet。尽管如此,我还是强烈建议您选择第一个选项

示例

注:以下代码为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()

在Swift 4中使用Alamofire检查interner

import Foundation
import Alamofire

class Connectivity {

   class func isConnectedToInternet() ->Bool {
        return NetworkReachabilityManager()!.isReachable
   }
}
然后调用这个函数

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

在Swift 4中使用Alamofire检查interner

import Foundation
import Alamofire

class Connectivity {

   class func isConnectedToInternet() ->Bool {
        return NetworkReachabilityManager()!.isReachable
   }
}
然后调用这个函数

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


检查您是否“连接”和是否可以访问Internet上的某个主机之间有很大的区别。您可以使用“正常”可达性来查看是否已连接。如果是,请尝试“ping”某个特定主机,看看它是否响应。就应用程序的功能而言,连接和能够访问主机之间有什么区别?另外,在每次启动DB数据拉取之前,是否经常尝试ping主机会大大降低应用程序的速度?@AlekPiasecki使用URLSession在大多数情况下就足够了。如果您尝试下载数据,但没有internet连接,则错误描述为internet连接似乎处于脱机状态。只需向用户显示一个警报,并将错误本地化描述作为消息传递。@LeoDabus URLSession如何处理解析服务器数据调用?对我的数据库的调用没有格式化为URLRequests,那么我该如何处理呢?@AlekPiasecki您需要同时使用URLSession和可达性。当可达性告诉您标志已更改时,您可以使用URLSession获取应用程序数据。如果发生错误,只显示返回的错误。检查是否“连接”与是否可以访问Internet上的某个主机之间有很大区别。您可以使用“正常”可达性来查看是否已连接。如果是,请尝试“ping”某个特定主机,看看它是否响应。就应用程序的功能而言,连接和能够访问主机之间有什么区别?另外,在每次启动DB数据拉取之前,是否经常尝试ping主机会大大降低应用程序的速度?@AlekPiasecki使用URLSession在大多数情况下就足够了。如果您尝试下载数据,但没有internet连接,则错误描述为internet连接似乎处于脱机状态。只需向用户显示一个警报,并将错误本地化描述作为消息传递。@LeoDabus URLSession如何处理解析服务器数据调用?对我的数据库的调用没有格式化为URLRequests,那么我该如何处理呢?@AlekPiasecki您需要同时使用URLSession和可达性。当可达性告诉您标志已更改时,您可以使用URLSession获取应用程序数据。如果发生错误,只显示返回的错误。我看到了列表和枚举值,但您能否更详细地解释一下,也许可以举个例子,说明我将如何在应用程序中使用它?我很难理解它的实现,这取决于它的实现。您是使用内置的
URLSession
发出请求,还是使用类似Alamofire的第三方库?更新了答案无需将错误转换为URLError。仅显示带有错误本地化描述的警报。查看我今天在@Malik发布的答案,如果我的数据拉取当前未使用
URLSession
,该如何工作。我使用了一个解析服务器,我的数据拉取使用
findObjectIn运行