如何检查alamofire的互联网连接?

我正在使用下面的代码在服务器中发出HTTP请求。现在我想知道它是否连接到互联网或不。下面是我的代码

let request = Alamofire.request(completeURL(domainName: path), method: method, parameters: parameters, encoding: encoding.value, headers: headers) .responseJSON { let resstr = NSString(data: $0.data!, encoding: String.Encoding.utf8.rawValue) print("error is \(resstr)") if $0.result.isFailure { self.failure("Network") print("API FAILED 4") return } guard let result = $0.result.value else { self.unKnownError() self.failure("") print("API FAILED 3") return } self.handleSuccess(JSON(result)) } 

对于swift 3.1和Alamofire 4.4 ,我创build了一个名为Connectivity Swift类。 使用Alamofire NetworkReachabilityManager类,并根据需要configure isConnectedToInternet()方法。

 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是鼓励计算属性,您可以更改上述function,如:

 import Foundation import Alamofire class Connectivity { class var isConnectedToInternet:Bool { return NetworkReachabilityManager()!.isReachable } } 

并使用它像:

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

Swift 2.3

 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 } } } 

Swift 3.0

  Alamofire.upload(multipartFormData: { multipartFormData in }, to: URL, method: .post,headers: nil, encodingCompletion: { (result) in switch result { case .success( _, _, _): break case .failure(let encodingError ): print(encodingError) if let err = encodingError as? URLError, err.code == .notConnectedToInternet { // no internet connection print(err) } else { // other failures } } }) 

对于Swift 3/4,

在Alamofire中,有一个叫做NetworkReachabilityManager的类,可以用来观察或者检查互联网是否可用。

 let reachabilityManager = NetworkReachabilityManager() reachabilityManager?.startListening() reachabilityManager?.listener = { _ in if let isNetworkReachable = self.reachabilityManager?.isReachable, isNetworkReachable == true { //Internet Available } else { //Internet Not Available" } } 

在这里,每当互联网状态发生变化时,监听者都会被调用。 你可以随意处理。

  func isConnectedToNetwork() -> Bool { var zeroAddress = sockaddr_in() zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress)) zeroAddress.sin_family = sa_family_t(AF_INET) let defaultRouteReachability = withUnsafePointer(&zeroAddress) { SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)) } var flags = SCNetworkReachabilityFlags() if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) { return false } let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0 let needsConnection = (flags.rawValue UInt32(kSCNetworkFlagsConnectionRequired)) != 0 return (isReachable && !needsConnection) } // Call api method func callApi(){ if isConnectedToNetwork() { // Network Connection status // Call your request here }else{ //"Your Internet connection is not active at this time." } } 

如果你转到NetworkReachabilityManager.swift你会看到这个

///networking当前是否可达 public var isReachable:Bool {return isReachableOnWWAN || isReachableOnEthernetOrWiFi}

所以我写在我的APIhandlerClass

 import AlamofireNetworkActivityIndicator private let manager = NetworkReachabilityManager(host: "www.apple.com") func isNetworkReachable() -> Bool { return manager?.isReachable ?? false } 

所以这告诉我networking的状态。

如果Alamofire.upload 结果返回成功,则下面是上传图片时检查互联网可用性的方法:

 Alamofire.upload(multipartFormData: { multipartFormData in for (key,value) in parameters { multipartFormData.append((value).data(using: .utf8)!, withName: key) } multipartFormData.append(self.imageData!, withName: "image" ,fileName: "image.jpg" , mimeType: "image/jpeg") }, to:url) { (result) in switch result{ case .success(let upload, _, _): upload.uploadProgress(closure: { (progress) in print("Upload Progress: \(progress.fractionCompleted)") }) upload.responseJSON { response in if let statusCode = response.response?.statusCode{ if(statusCode == 201){ //internet available } }else{ //internet not available } } case .failure(let encodingError): print(encodingError) } }