2016-02-16 23 views
6

Nella mia app sto provando ad accedere utente tramite UIWebView. In caso di successo i cookie di accesso sono impostati su NSHTTPCookieStorage. Poche pagine della mia app sono aperte in UIWebView.La sessione non viene mantenuta tra UIWebView

Quando viene inviata una richiesta per una particolare pagina Web, controlla se l'utente ha effettuato l'accesso o meno in base ai cookie.

Ho verificato che i cookie siano presenti in NSHTTPCookieStorage, ma non sono cookie validi sul server. Vale a dire, considera utente come utente disconnesso.

Il mio codice per il caricamento UIWebView è come qui sotto:

let url = serverURL + urlString 
let urlRequest = NSMutableURLRequest(URL: NSURL(string: url)!) 
webPage.loadRequest(urlRequest) 

Anche ho provato con NSURLSession e l'impostazione cookie come HTTPHeaderField. Di seguito è riportato anche il mio codice:

let URLRequest: NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: url)!) 

let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: serverURL)!) 
for cookie in cookies!{ 
    URLRequest.setValue(cookie.value, forHTTPHeaderField: cookie.name) 
} 

let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration() 
let session = NSURLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil) 

let task = session.downloadTaskWithRequest(URLRequest) 
task.resume() 

Funziona correttamente per pochi casi. Non riesco a trovare quello che può essere un problema con i cookie.

Qualsiasi aiuto sarà apprezzato.

Grazie in anticipo

+0

Considera di provare 'WKWebView' (iOS 8+). Con esso è possibile copiare la proprietà 'configuration' dall'ultima istanza utilizzata a una nuova creata e _maybe_ questa conserverà i cookie. In alternativa, utilizzare l'istanza _one_ di UIWebView per l'applicazione. – werediver

+0

sto affrontando il problema simile, aiuto gentile –

risposta

0

Il seguente codice non fa quello che si intendono:

for cookie in cookies!{ 
    URLRequest.setValue(cookie.value, forHTTPHeaderField: cookie.name) 
} 

Quando i cookie vengono inviati tramite HTTP, vengono inviati in un Cookie intestazione del formato:

Cookie: cookie1=value1; cookie2=value2 

Si stanno creando intestazioni multiple denominate il nome del cookie, quindi la richiesta è simile a:

cookie1: value1 
cookie2: value2 

Il modo più semplice per creare le intestazioni corrette è con NSHTTPCookie.requestHeaderFieldsWithCookies(_:[NSHTTPCookie]). Visto che hai aggiunto altre intestazioni, si può semplicemente fare:

if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: serverURL)!) { 
    URLRequest.allHTTPHeaderFields = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies) 
} 

Per inciso, si sta utilizzando URL diversi per la vostra richiesta e per cercare i biscotti. Dovrebbero essere uguali ai cookie possono essere associati a percorsi specifici in un dominio.

+0

Grazie @Brian Nickel. Ho risolto il mio problema in modo simile, ma dimentico di aggiungere la risposta –