web-dev-qa-db-de.com

Wie prüfe ich die Internetverbindung in alamofire?

Ich verwende den folgenden Code, um eine HTTP-Anforderung im Server zu erstellen. Jetzt möchte ich wissen, ob eine Verbindung zum Internet besteht oder nicht. Unten ist mein Code 

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

Für Swift 3.1 und Alamofire 4.4habe ich eine Swift-Klasse mit dem Namen Connectivity erstellt. Verwenden Sie die NetworkReachabilityManager-Klasse von Alamofire und configure der isConnectedToInternet()-Methode, je nach Bedarf.

import Foundation
import Alamofire

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

Verwendungszweck:

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

EDIT: Da Swift berechnete Eigenschaften ermutigt, können Sie die obige Funktion wie folgt ändern:

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

und benutze es wie:

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

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
            }

        }
    })

Verwenden von 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")
}
17
MAhipal Singh

Für Swift 3/4,

In Alamofire gibt es eine Klasse namens NetworkReachabilityManager, mit der beobachtet werden kann, ob Internet verfügbar ist oder nicht.

let reachabilityManager = NetworkReachabilityManager()

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

Hier wird der Listener jedes Mal aufgerufen, wenn sich der Status des Internets ändert. Sie können damit umgehen, wie Sie möchten.

9
Parth Adroja

Wenn Sie NetworkReachabilityManager.Swift gehen, werden Sie dies sehen

/// Ob das Netzwerk aktuell erreichbar ist . public var isReachable: Bool {return isReachableOnWWAN || isReachableOnEthernetOrWiFi}

Also habe ich dies in meine APIhandlerClass geschrieben

import AlamofireNetworkActivityIndicator

private let manager = NetworkReachabilityManager(Host: "www.Apple.com")

func isNetworkReachable() -> Bool {
    return manager?.isReachable ?? false
}

Das sagt mir also den Status des Netzwerks.

2
Umair Afzal
  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."
        }
    }
1
MAhipal Singh

Verwendung der RequestAdapter-Klasse von alamofire und Auslösungsfehler, wenn keine Internetverbindung besteht

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

}

Setze jetzt den Adapter auf Alamofire Session Manager

let sessionManager = Alamofire.SessionManager(configuration: configuration)

sessionManager.adapter = RequestInterceptor()

Wenn Sie jetzt Alamofire Request erstellen, fangen Sie den Fehler in DataResponse ab. Dieser Mechanismus wird für alle Anfragen gelten.

0

Wenn Alamofire.upload result Erfolg zurückgibt, können Sie im Folgenden die Verfügbarkeit des Internets überprüfen, während Sie ein Bild hochladen:

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)

                }

            }
0
Nupur Sharma

Im Allgemeinen ist es besser als die Erreichbarkeit, wenn Sie die Internet-Offline-Informationen aus dem tatsächlichen Anruf abrufen können. Sie können sicher sein, dass der eigentliche API-Aufruf fehlgeschlagen ist, weil das Internet ausgefallen ist. Wenn Sie die Erreichbarkeit testen, bevor Sie eine API aufrufen, und diese fehlschlägt, wissen Sie nur, dass das Internet nach Abschluss des Tests offline war (oder Apple war inaktiv)), das wissen Sie nicht Wenn Sie make den Anruf tätigen, ist das Internet offline. Möglicherweise denken Sie, dass es eine Frage der Millisekunden ist, nachdem der Aufruf zur Erreichbarkeit zurückgekehrt ist, oder Sie haben den gespeicherten Wert abgerufen, aber das ist tatsächlich nicht deterministisch Sie haben eine beliebige Anzahl von Threads geplant, bevor die Erreichbarkeit ihre Werte beim Schließen zurückgibt, oder Sie aktualisieren, was auch immer global Sie speichern.

Und die Erreichbarkeit hatte in der Vergangenheit Fehler im eigenen Code.

Dies bedeutet nicht, dass Sie den NetworkReachabilityManager von alamofire nicht verwenden sollten, um Ihre Benutzeroberfläche zu ändern, sie anzuhören und alle Komponenten der Benutzeroberfläche zu aktualisieren.

Wenn Sie jedoch Grund haben, eine API aufzurufen, ist der Test auf Erreichbarkeit auf dieser API-Ebene überflüssig oder führt möglicherweise zu subtilen Fehlern.

0
Eoin Norris