2015-03-18 11 views
5

Utilizzo di Swift e NSURLSession. L'NSError localizedDescription che ottengo è molto generico quando non ho una connessione internet (manualmente disattivata la rete wifi/cellulare). Si dice "L'operazione non può essere completata."NSURLManagement degli errori di sessione

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

Sto cercando un messaggio più determinata per inviare all'utente. Ho attivato un punto di interruzione e controllato tutti gli oggetti ma non riesco a trovare nulla di buono.

Prima rapida stavo usando AFNetworking con l'obiettivo C:

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

I messaggi di errore vorrei arrivare qui erano molto descrittivo, qualcosa come "la connessione Internet sembra essere offline"

+1

Devi gestire gli errori Internet da solo. 'AFNetworking' implementa' Raggiungibilità' da solo, ecco perché i loro errori sono più descrittivi e consapevoli del contesto. Inoltre, puoi usare 'AFNetworking' nel tuo progetto rapido, come descritto qui.[AFNetworking Integrate Swift] (https://medium.com/@aommiez/afnetwork-integrate-swfit-80514b545b40) –

+0

hmm stava cercando di uscire dalla dipendenza delle librerie esterne. Ma sembra che userò alamo fire (versione AFNetworking di Swift) quindi https://github.com/Alamofire/Alamofire – MobileMon

+1

Un piccolo chiarimento: concordo sul fatto che le librerie come Alamofire e AFNetworking offrano una gestione degli errori più ricca, ma è perché loro " ricontrollare le cose che altrimenti dovremmo controllare manualmente (ad es. correggere 'Content-Type',' statusCode' di 'NSHTTPURLResponse', ecc.). Questo non ha nulla a che fare con il fatto che AFNetworking offre (ma non utilizza, per impostazione predefinita) Raggiungibilità. Per errori di rete generali, restituiscono semplicemente gli stessi oggetti 'NSError' che otteniamo quando lo facciamo manualmente da soli. – Rob

risposta

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

Questa implementazione mostra un avviso all'utente che qualcosa è andato storto. Puoi gestire l'errore come preferisci (ad esempio riprovando la richiesta senza disturbare l'utente con un avviso). UIAlertController è solo iOS 8. Se si desidera supportare iOS 7 mostrare uno UIAlertView.

18

Vedere code e domain dell'oggetto NSError risultante. Puoi diagnosticare perché ha fallito nel guardarli.

Ad esempio, un dominio di NSURLErrorDomain e un codice di -1009 significa che non sei connesso a Internet. Quindi, in Swift 3:

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

È possibile visualizzare un elenco di questi codici nel Global Variables - Foundation Constants Reference. Basta esplorare sotto il "dominio NSURL".

Inoltre, la ricerca di NSURLErrorNotConnectedToInternet premendo comando + spostamento + o e poi, ti verrà portato al colpo di testa rilevante (NSURLError.h). Personalmente per questo genere di cose, tendo a fidarmi delle intestazioni un po 'di più della documentazione. Se si esegue questa operazione di ricerca quando si lavora con Objective-C, potrai anche vedere rinvio a CFURLError codici (che è possibile sia comando click sul comando o + spostamento + o e cercare kCFURLErrorNotConnectedToInternet) e se li esplori, vedrai effettivamente i valori numerici associati a queste costanti.

+0

questo è utile. Esiste una lista completa che specifica tutti i codici/domini di errore e le loro descrizioni? – MobileMon

+1

Per i codici 'NSURLErrorDomain', suggerirei di guardare le intestazioni. Vedi sopra. Non penso che gli altri domini siano rilevanti qui. – Rob

+0

Questa è l'enumerazione del dominio NSUrlError [https://developer.apple.com/reference/foundation/nsurlerror](https://developer.apple.com/reference/foundation/nsurlerror) – bJacoG

-1

Si intende lo operation.responseString per una specifica risposta di errore dal backend? Ho appena trovato ieri, check this out nel blocco fallimento di AFHTTPSessionManager richiesta

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

Ecco the question I asked at AFN/Github. Spero che sarà utile.

Problemi correlati