2014-11-20 22 views
7

Quando creo nuova richiesta di WKWebView con cookie di autenticazione e invia la richiesta, WKWebView viene caricata correttamente pagina web protetta:Perdere biscotti in WKWebView

let req = NSMutableURLRequest(URL: NSURL(string: urlPath)!) 
let headers = NSHTTPCookie.requestHeaderFieldsWithCookies([myAuthCookie]); 
req.allHTTPHeaderFields = headers; 
webView.loadRequest(req) 

Il problema è che, quando l'utente fa clic su un link nella pagina web, con nuova richiesta WKWebView perde il cookie di autenticazione e viene reindirizzato alla pagina di accesso. Il dominio e il percorso del cookie sono completi e corretti.

Sono a conoscenza della funzionalità mancante di WKWebView menzionata here.

Grazie in anticipo per qualsiasi idea.

+0

Ho lottato con questo problema per giorni. Sembra sconcertante che la memorizzazione/l'uso dei cookie sia così rotto in WKWebView. In attesa di sentire qualsiasi soluzione a questo. – Chris

+0

Possibile duplicato di [Posso impostare i cookie per essere utilizzato da un WKWebView?] (Http://stackoverflow.com/questions/26573137/can-i-set-the-cookies-to-be-used-by-a -wkwebview) – Prcela

risposta

0

È possibile inserire alcuni javascript nella visualizzazione per caricare i cookie in modo che le richieste avviate dalla visualizzazione Web dispongano anche dei cookie. Vedere la risposta a questa domanda per maggiori dettagli:

https://stackoverflow.com/a/26577303/251687

2

Suppongo che quando si imposta nella richiesta si sta inviando il cookie al server ma non l'impostazione nel WKWebview. I cookie vengono solitamente impostati dal server nell'intestazione "Set-Cookie" e quindi dovrebbero essere mantenuti. Quindi, se, se non si dispone di un problema con i cookie di passare tutto il percorso al server e di nuovo si può fare un trucco:

  1. inviare il cookie nella prima richiesta
  2. rendere il server rispedirlo in "Set-Cookie" intestazione
  3. ogni richiesta successiva dovrebbe avere il cookie

non ho ancora provato l'approccio, ma sarà molto sorpreso se non funziona.

L'alternativa menzionata da Sebastien potrebbe essere iniettata tramite javascript. Ricorda però che non puoi impostare flag "HTTP-Only" in questo modo e il cookie sarà disponibile per tutti gli script in esecuzione (https://www.owasp.org/index.php/HttpOnly).

Sto ancora cercando di trovare un modo naturale per impostare il cookie ma non penso che esista.

Spero che aiuti.

+0

Ciao alex, sai se qualcosa è cambiato qui? I cookie sono gestiti meglio in WKWebView? – J2N

+0

Ciao JLaw, dai uno sguardo qui https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/Objective-C/WebKit.html Penso che abbiano fornito il modo migliore per gestire i cookie in iOS9 anche se non l'ho provato io stesso – Alex

+0

Questo è ottimo, proprio quello di cui avevo bisogno per il mio server personalizzato Node.js. Non posso credere che non ci ho pensato. Stavo modellando il processo di assorbimento dei cookie al contrario. Ovviamente il server deve inviare Set-Cookie per rendere WKWebView in grado di integrarlo nel suo negozio di biscotti interno (opaco!?! Argh). Quando WKWebView lo include in un loadRequest, è un'intestazione * inviata * arbitraria. Per impostazione predefinita, il server Web non rileva la necessità di tornare indietro "Imposta cookie" - presuppone giustamente che il browser lo abbia già. – BaseZen

4

La cosa migliore da fare è quello di memorizzare il cookie nel

[NSHTTPCookieStorage sharedHTTPCookieStorage] 

Poi ogni volta che si desidera caricare la richiesta, chiamare questa funzione invece:

- (void)loadRequest:(NSURLRequest *)request { 
     if (request.URL) { 
      NSDictionary *cookies = [NSHTTPCookie requestHeaderFieldsWithCookies:[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL]]; 
      if ([cookies objectForKey:@"Cookie"]) { 
       NSMutableURLRequest *mutableRequest = request.mutableCopy; 
       [mutableRequest addValue:cookies[@"Cookie"] forHTTPHeaderField:@"Cookie"]; 
       request = mutableRequest; 
      } 
     } 

     [_wkWebView loadRequest:request]; 
} 

Si estrarre i biscotti giusti dai cookie condivisi e li include nella richiesta

+0

WKWebViews's loadRequest restituisce WKNavigation * invece di void: [https://developer.apple.com/reference/webkit/wkwebview/1414954-loadrequest] – gyimi

+0

@gyimi Hum Non ho mai detto una cosa del genere. Non ti ho dato il punto –

+1

Hai commentato: "Quindi ogni volta che vuoi caricare la richiesta, chiama invece questa funzione: ' - (** void **) loadRequest: (NSURLRequest \ *) request' ". I ritorni su loadRequest di WKWebView ** WKNavigation \ * ** invece di ** void **. Ciò che hai scritto funziona perfettamente con UIWebViews, ma la domanda iniziale menzionava WKWebViews. – gyimi