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

Yo estoy usando el siguiente código para hacer la petición HTTP en el servidor.Ahora quiero saber si está conectado a internet o no. A continuación es 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))
    }
usted puede usar accesibilidad de la red
Es posible que desee comprobar esta respuesta
Posibles duplicados de Verificación de conexión a Internet disponibilidad?

OriginalEl autor Dhiraj Kumar | 2016-12-26

8 Kommentare

  1. 65

    Para swift 3.1 y Alamofire 4.4 ,he creado un swift clase llamada Connectivity . Uso NetworkReachabilityManager clase de Alamofire y configure la isConnectedToInternet() método como por su necesidad.

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

    Uso:

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

    EDICIÓN:
    Desde swift es alentador calculada propiedades, puede cambiar la función anterior como:

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

    y utilizarlo como:

    if Connectivity.isConnectedToInternet {
            print("Yes! internet is available.")
            //do some tasks..
     }
    Simple, de trabajo y reutilizables. No sé, aunque si es mejor hacerlo de un protocolo con la extensión y reemplazar en necesario lugares.
    Yo nunca he usado class var. ¿Cuál es la diferencia de hacerlo y shared let? Yo conozco sus diferentes. Simplemente no está seguro de cómo!
    Acabo de hacer una exploración de la variable que se puede llamar en un tipo de clase directamente. También puede utilizar estática que es mejor en este caso. ¿A qué te refieres por que?

    OriginalEl autor abhi1992

  2. 18

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

    Utilizando 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")
    }
    Cada vez que yo llamo a esta función por primera vez se da .accesible cierto, no importa lo que el estado de la conexión de internet es

    OriginalEl autor MAhipal Singh

  3. 10

    Para Swift 3/4,

    En Alamofire, hay una clase llamada NetworkReachabilityManager que puede ser utilizado para el observador o comprobar 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í, oyente se llama cada vez que hay cambios en el estado de internet. Usted puede manejar como quisiera.

    Y lo hace de la reachabilityManager necesitan ser deinitialised en deint() ?
    Depende del caso de uso si usted lo desea en toda la aplicación, a continuación, no es necesario que se iba a declarar en el AppDelegate. Si el caso de uso, es de un solo disparo, a continuación, usted puede deinit NetworkReachabilityManager.
    cómo utilizar el código de arriba?

    OriginalEl autor Parth Adroja

  4. 2

    Si goto NetworkReachabilityManager.swift verá esta

    ///Si la red es actualmente accesible.
    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
    }

    Por lo que esto me dice el estado de la red.

    por favor, dar soluton en alamofire sólo
    Es una parte de alamofire

    OriginalEl autor Umair Afzal

  5. 1
      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."
            }
        }
    Quiero hacerlo por alamofire no reachibilty
    vamos a reachabilityManager = Alamofire.NetworkReachabilityManager(host: «www.apple.com») func listenForReachability() { reachabilityManager?.escucha = { estado en print(«el Estado de la Red ha Cambiado: (estado)») interruptor de estado { caso .NotReachable: descanso //Mostrar mensaje de error estado del caso .Accesible(_), .Desconocido: descanso //Ocultar el estado de error } } reachabilityManager?.startListening() }
    de los que no puedo seguir este enfoque por favor revisar mi código & proporcionar la solución

    OriginalEl autor MAhipal Singh

  6. 0

    Si Alamofire.subir resultado devuelve éxito, a continuación, siguiente es la forma de comprobación de internet de la disponibilidad al subir 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)
    
                    }
    
                }

    OriginalEl autor Nupur Sharma

  7. 0

    Utilizando RequestAdapter clase de alamofire y tirar 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: "<your bundle id>", code:code, userInfo: [NSLocalizedDescriptionKey : localizedDescription])
    }
    static var NoInternet : NSError {
        return createWithLocalizedDesription(withCode: -1009,localizedDescription:"Please check your internet connection")
    }
    
    }

    Ahora establece el adaptador para Alamofire Session Manager

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

    Ahora cada vez Que al crear Alamofire Solicitud, detectar el error en DataResponse. Este mecanismo ley común a todos los de la solicitud

    NO utilice la Accesibilidad para determinar si una solicitud de red debe ser enviado. Usted debe enviar SIEMPRE. ref: github.com/Alamofire/Alamofire/blob/master/Documentation/…

    OriginalEl autor Aromal Sasidharan

  8. 0

    En general, si usted puede conseguir el internet fuera de línea de la información de la llamada actual, es mejor que la accesibilidad. Usted puede estar seguro de que la llamada a la API ha fallado porque el internet es hacia abajo. Si prueba para la accesibilidad antes de llamar a una API y se produce un error, a continuación, todo lo que sé es que cuando la prueba se realiza el internet estuvo fuera de línea ( o de Apple fue abajo), usted no sabe que cuando usted hacer la llamada, el internet va a estar fuera de línea. Usted podría pensar que es una cuestión de milisegundos después de que la accesibilidad de la llamada devuelve, o que se ha recuperado el valor almacenado, pero eso es en el hecho de que no determinista. El sistema operativo podría haber programado arbitraria en el número de los hilos antes de la accesibilidad de la devuelve a sus valores, en su cierre, o actualizaciones de lo global que se va a almacenar.

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

    Esto no quiere decir que usted no debe usar alamofire del NetworkReachabilityManager para cambiar la interfaz de usuario, escuchar y actualización de todos los componentes de interfaz de usuario.

    Pero si usted tiene razones para llamar a una API, en la que la capa de API de la prueba para la accesibilidad es redundante, o posiblemente causará algunos pequeños errores.

    OriginalEl autor Eoin Norris

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea