如何检查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) } }