Cómo verificar la conexión a internet en alamofire?

Estoy usando el código siguiente para hacer una solicitud HTTP en el servidor. Ahora quiero saber si está conectado a internet o no. A continuación está mi código

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

Para swift 3.1 y Alamofire 4.4 , creé una clase rápida llamada Connectivity . Utilice la clase NetworkReachabilityManager de Alamofire y configure el método isConnectedToInternet() según su necesidad.

 import Foundation import Alamofire class Connectivity { class func isConnectedToInternet() ->Bool { return NetworkReachabilityManager()!.isReachable } } 

Uso:

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

EDITAR: como swift está fomentando las propiedades calculadas, puede cambiar la función anterior como:

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

y úsalo como:

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

Usando NetworkReachabilityManager

 let networkReachabilityManager = Alamofire.NetworkReachabilityManager(host: "www.apple.com") func checkForReachability() { self.networkReachabilityManager?.listener = { status in print("Network Status: \(status)") switch status { case .notReachable: //Show error here (no internet connection) case .reachable(_), .unknown: //Hide error here } } self.networkReachabilityManager?.startListening() } //How to Use : Just call below function in required class if checkForReachability() { print("connected with network") } 

Para Swift 3/4,

En Alamofire, hay una clase llamada NetworkReachabilityManager que se puede usar para observar o verificar si Internet está disponible o no.

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

Aquí, se llamará al oyente cada vez que haya cambios en el estado de Internet. Puede manejarlo como lo desee.

Si selecciona NetworkReachabilityManager.swift , verá esto

/// Si la red es actualmente alcanzable. public var isReachable: Bool {return isReachableOnWWAN || isReachableOnEthernetOrWiFi}

Así que he escrito esto en mi APIhandlerClass

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

Entonces esto me dice el estado de la red.

  func isConnectedToNetwork()-> Bool { var zeroAddress = sockaddr_in() zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) zeroAddress.sin_family = sa_family_t(AF_INET) let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) } } //Commented code only work upto iOS Swift 2.3 // let defaultRouteReachability = withUnsafePointer(to: &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." } } 

Si el resultado de Alamofire.upload es exitoso, a continuación se muestra la forma de verificar la disponibilidad de Internet al cargar una imagen:

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

Usar la clase RequestAdapter de alamofire y lanzar error cuando no hay conectividad a Internet

 class RequestInterceptor : RequestAdapter{ func adapt(_ urlRequest: URLRequest) throws -> URLRequest { let reachable = NetworkReachabilityManager()?.isReachable ?? false if !reachable{ throw NSError.NoInternet } var nUrlRequest = urlRequest // modify request if needed return nUrlRequest } } extension NSError { static func createWithLocalizedDesription(withCode code:Int = 204,localizedDescription:String) -> NSError{ return NSError(domain: "", code:code, userInfo: [NSLocalizedDescriptionKey : localizedDescription]) } static var NoInternet : NSError { return createWithLocalizedDesription(withCode: -1009,localizedDescription:"Please check your internet connection") } } 

Ahora configura el adaptador en Alamofire Session Manager

 let sessionManager = Alamofire.SessionManager(configuration: configuration) sessionManager.adapter = RequestInterceptor() 

Ahora, cada vez que crea una solicitud de Alamofire , detecta el error en DataResponse. Este mecanismo actuará en común a todas las solicitudes

En general, si puede obtener la información de Internet fuera de línea de la llamada real, es mejor que la accesibilidad. Puede estar seguro de que la llamada API real ha fallado porque Internet no funciona. Si prueba la accesibilidad antes de llamar a una API y falla, entonces todo lo que sabe es que cuando la prueba se completó, Internet no estaba en línea (o Apple estaba inactivo), no sabe que cuando realice la llamada, Internet será desconectado. Puede pensar que es cuestión de milisegundos después de que la llamada de accesibilidad regrese, o que haya recuperado el valor almacenado, pero de hecho no es determinista. El sistema operativo puede haber progtwigdo una cantidad arbitraria de subprocesos antes de que la accesibilidad regrese sus valores en su cierre, o actualice cualquier elemento global que esté almacenando.

Y la accesibilidad históricamente ha tenido errores en su propio código.

Esto no quiere decir que no deba usar NetworkReachabilityManager de alamofire para cambiar su UI, escucharla y actualizar todos los componentes de la interfaz de usuario.

Pero si tiene razones para llamar a una API, en esa capa de API la prueba de accesibilidad es redundante, o posiblemente cause algunos errores sutiles.