2015-03-18 18 views
5

Verwenden von Swift und NSURLSession. Die NSError localizedDescription, die ich erhalte, ist sehr generisch, wenn ich keine Internetverbindung habe (manuell ausgeschaltetes WLAN/Zellennetzwerk). Er sagt: „Der Vorgang konnte nicht abgeschlossen werden.NSURLSession-Fehlerbehandlung

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 

Ich bin für eine bestimmte Nachricht suchen, um den Benutzer zu senden. Ich habe einen Haltepunkt aktiviert und alle Objekte überprüft, kann aber nichts Gutes finden.

Vor swift Ich war AFNetworking mit Objective-C mit:

failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

Die Fehlermeldungen ich hier waren sehr beschreibend bekommen würde, so etwas wie "die Internet-Verbindung scheint offline zu sein"

+1

Sie müssen Internetfehler selbst behandeln. 'AFNetworking' implementiert' Erreichbarkeit' selbst, deshalb sind ihre Fehler beschreibender und kontextbezogener. Zusätzlich können Sie 'AFNetworking' in Ihrem schnellen Projekt verwenden, wie hier beschrieben.[AFNetworking Integrate Swift] (https://medium.com/@aommiez/afnetwork-integrate-swfit-80514b545b40) –

+0

hmm versuchte, sich von der Abhängigkeit externer Bibliotheken zu lösen. Aber es sieht so aus, als würde ich Alamo Fire (AFNetworking Version von Swift) und dann https://github.com/Alamofire/Alamofire verwenden. – MobileMon

+1

Eine kleine Klarstellung: Ich stimme zu, dass Bibliotheken wie Alamofire und AFNetworking eine bessere Fehlerbehandlung bieten, aber es ist, weil sie reche auf Dinge, nach denen wir sonst manuell suchen müssen (zB 'Content-Type',' StatusCode' der 'NSHTTPURLResponse', etc.). Dies hat nichts damit zu tun, dass AFNetworking die Erreichbarkeit anbietet (aber nicht standardmäßig verwendet). Bei allgemeinen Netzwerkfehlern geben sie einfach dieselben "NSError" -Objekte zurück, die wir selbst erhalten, wenn wir dies manuell tun. – Rob

Antwort

0
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
if error == nil { 
    //all ok do what you want to do 
} else { 
    let alertController = UIAlertController(title: "Error", message: "Put your error message here", preferredStyle: .Alert) 

    let cancelAction = UIAlertAction(title: "OK", style: .Cancel) { (action) in 
         } 
    alertController.addAction(cancelAction) 
    self.presentViewController(alertController, animated: true) 
} 
}) 

Diese Implementierung zeigt eine Warnung an den Benutzer an, dass etwas schief gelaufen ist. Sie können den Fehler so behandeln, wie Sie möchten (z. B. indem Sie die Anfrage wiederholen, ohne den Benutzer mit einer Warnung zu belästigen). UIAlertController ist nur iOS 8. Wenn Sie iOS 7 unterstützen möchten, zeigen Sie eine UIAlertView.

18

Betrachten Sie die code und domain der resultierenden NSError Objekt. Sie können diagnostizieren, warum es versäumt hat, diese anzusehen.

Zum Beispiel bedeutet eine Domain von NSURLErrorDomain und ein Code von -1009, dass Sie nicht mit dem Internet verbunden sind. So in Swift 3:

if let error = error as? NSError, error.domain == NSURLErrorDomain && error.code == NSURLErrorNotConnectedToInternet { 
    print("not connected") 
} 

Sie können eine Liste dieser Codes im Global Variables - Foundation Constants Reference sehen. Erkunden Sie einfach unter der "NSURL Domain".

Auch Suche nach NSURLErrorNotConnectedToInternet durch Drücken Befehl + Verschiebung + o und dann werden Sie auf die entsprechenden Header (NSURLError.h) entnommen werden. Persönlich für diese Art von Dingen tendiere ich dazu, den Kopfzeilen etwas mehr zu vertrauen als der Dokumentation. Wenn Sie diese Suche zu tun, wenn sie mit Objective-C arbeiten, werden Sie auch Querverweis auf CFURLError Codes sehen (die Sie entweder Befehl -Klick auf oder Befehl + Verschiebung + o und die Suche nach kCFURLErrorNotConnectedToInternet) Wenn Sie diese untersuchen, sehen Sie tatsächlich die numerischen Werte, die diesen Konstanten zugeordnet sind.

+0

das ist hilfreich. Gibt es eine vollständige Liste, die alle Fehlercodes/Domains und deren Beschreibungen angibt? – MobileMon

+1

Für "NSURLErrorDomain" -Codes würde ich vorschlagen, die Kopfzeilen zu betrachten. Siehe oben. Ich glaube nicht, dass die anderen Domains hier relevant sind. – Rob

+0

Dies ist die NSUrlError Domain-Enumeration [https://developer.apple.com/reference/foundation/nsurlerror](https://developer.apple.com/reference/foundation/nsurlerror) – bJacoG

-1

Meinst du die operation.responseString für spezifische Fehlerantwort vom Backend? Ich fand es erst gestern, diesen Block in Ausfall Besuche von AFHTTPSessionManager Anfrage

NSError *underError = error.userInfo[@"NSUnderlyingError"]; 
NSData *responseData = underError.userInfo[@"com.alamofire.serialization.response.error.data"]; 

the question I asked at AFN/Github hier. Ich hoffe, es wird hilfreich sein.