检查Internet连接可用性?

我只需要检查互联网连接的可用性,然后开始与我的iphone应用程序中的服务进行通信。 我正在使用Swift 1.2和Xcode 6作为我的开发环境…

我刚刚做了一些研究,发现这个stackoverflow在目标C中的链接 。

因此,我试图在SWIFT中find类似的解决scheme,并find以下链接

https://coderwall.com/p/mhxbpq/checking-for-internet-connection-availability

只是为了使事情变得容易,该链接的内容如下:

import Foundation import SystemConfiguration public class Reachability { class func isConnectedToNetwork() -> Bool { var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress)) zeroAddress.sin_family = sa_family_t(AF_INET) let defaultRouteReachability = withUnsafePointer(&zeroAddress) { SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue() } var flags: SCNetworkReachabilityFlags = 0 if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 { return false } let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0 let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0 return (isReachable && !needsConnection) ? true : false } } 

并检查连接可用性是这样的…

 if Reachability.isConnectedToNetwork() { println("Haz Interwebz!") } else { println("Oh noes! No interwebz!!!") } 

注意:要工作,需要将SystemConfiguration.framework添加到项目中(对于“链接的框架和库”)….

所以….我的问题是,我对iOS开发很新,不太清楚使用这个逻辑来完成它的好处和可靠性。 这个class里的大部分东西都完全不清楚,但是我做的小testing很好!

喜欢听听更多的开发者不得不对此说些什么。

我今天早上想为自己解决同样的问题,我觉得从Apple提供的这个“Reachability”示例代码根本不吸引我(主要是因为手动打开套接字和SystemConfiguration丑陋的API)。

而不是这个我试图做一个简单的HTTP连接到一个随机的不存在的URL使用Alamofire(我已经把它作为一个依赖),并检查错误,我会收到的价值。

 Alamofire.request(.GET, "http://superrandomdomainnamethatisnotused.com/superrandompath").responseString { (request, response, stringData, error) in if let networkError = error { if (networkError.code == -1009) { println("No Internet \(error)") } } } 

此代码可以使用任何其他networking库进行重写。 错误-1009对应于NSURLErrorNotConnectedToInternet ,这是比较让人放心的说“ 你真的没有连接到互联网 ”的方式。

另一件好事是,即使您放置了不存在的URL,也可以正常工作,这意味着即使您连接到Internet,也不必向任何服务器发送成功的HTTP请求。

缺点是块中的代码是asynchronous执行的,这可能是不方便的,这取决于您的要求。

@ Lachezar对Swift2.x的解答的改进版本:

 Alamofire.request(.POST, url).responseJSON { response in switch response.result { case .Success(let json): // internet works. case .Failure(let error): if let err = error as? NSURLError where err == .NotConnectedToInternet { // no internet connection } else { // other failures } } } 

如果您想在不parsingurl的情况下使用networking状态,我build议您使用以下解决scheme: https : //stackoverflow.com/a/38646078/706933