2014-11-20 6 views
7

Wenn ich neue Anforderung erstellen für WKWebView mit Authentifizierungscookie und die Anfrage senden, lädt WKWebView richtig geschützte Web-Seite:Losing Cookies in WKWebView

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

Das Problem ist, dass, wenn der Benutzer klickt auf einen beliebigen Link in der Webseite mit neuer Anfrage WKWebView verliert Authentifizierungscookie und wird zur Anmeldeseite umgeleitet. Cookie-Domäne und Pfad sind gefüllt und korrekt.

Ich bin mir der fehlenden Funktionalität von WKWebView erwähnt here.

Vielen Dank im Voraus für jede Idee.

+0

Ich habe seit Tagen mit diesem Problem gekämpft. Es scheint verwirrend, dass die Speicherung/Verwendung von Cookies in WKWebView so kaputt ist. Ich freue mich darauf, Lösungen dafür zu hören. – Chris

+0

Mögliches Duplikat von [Kann ich festlegen, dass die Cookies von einem WKWebView verwendet werden?] (Http://stackoverflow.com/questions/26573137/can-i-set-the-cookies-to-be-used-by-a -wkwebview) – Prcela

Antwort

0

Sie können Javascript in die Ansicht einfügen, um die Cookies zu laden, damit die von der Webansicht initiierten Anfragen auch Ihre Cookies enthalten. Siehe die Antwort auf diese Frage für weitere Informationen:

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

2

Ich nehme an, wenn Sie es in der Anfrage stellen Sie den Cookie an den Server senden, aber nicht in den WKWebview Einstellung. Die Cookies werden normalerweise vom Server im Header "Set-Cookie" gesetzt und sollten dann beibehalten werden. Wenn also, wenn Sie nicht ein Problem haben mit Cookie an den Server den ganzen Weg vorbei und zurück können Sie einen Trick:

  1. das Cookie in der ersten Anfrage senden
  2. machen den Server zurückschicken in das „Set-Cookie“ header
  3. jede nachfolgende Anforderung sollte das Cookie

ich den Ansatz noch nicht versucht haben, aber sehr überrascht, wenn es nicht funktioniert.

Die Alternative wie von Sebastien erwähnt könnte sein, injizieren Sie es über Javascript. Beachten Sie jedoch, dass Sie "HTTP-Only" nicht auf diese Weise markieren können und der Cookie von allen laufenden Skripten verfügbar ist (https://www.owasp.org/index.php/HttpOnly).

Ich bin immer noch auf der Suche nach einem natürlichen Weg, um den Cookie zu setzen, aber ich glaube nicht, dass es existiert.

Ich hoffe, es hilft.

+0

Hallo Alex, weißt du, ob sich hier etwas geändert hat? Werden Cookies in WKWebView besser behandelt? – J2N

+0

Hi JLaw, schauen Sie hier https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/Objective-C/WebKit.html Ich denke, dass sie den guten Weg zur Verfügung gestellt haben, Cookies in iOS9 zu behandeln, obwohl ich es selbst nicht versucht habe – Alex

+0

Das ist großartig, genau das, was ich für meinen benutzerdefinierten Node.js Server brauchte. Ich kann nicht glauben, dass ich nicht darüber nachgedacht habe. Ich habe den Cookie-Aufnahmeprozess umgekehrt modelliert. Natürlich muss der Server Set-Cookie senden, damit WKWebView es wieder in seinen internen (opaken!?! Argh) Cookie-Speicher integriert. Wenn WKWebView es in einer loadRequest enthält, handelt es sich um einen beliebigen * send * -Header. Der Web-Server sieht standardmäßig keine Notwendigkeit, "Cookie setzen" zurückzusenden - es nimmt zu Recht an, dass der Browser es bereits hat. – BaseZen

4

Das Beste, was zu tun ist, Ihre Cookie zu speichern in die

[NSHTTPCookieStorage sharedHTTPCookieStorage] 

jedes Mal, wenn Dann wollen die Anforderung laden, um diese Funktion stattdessen rufen:

- (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]; 
} 

es die richtige Cookies extrahieren von geteilten Cookies und schließt es in Ihre Anfrage ein

+0

WKWebViews loadRequest gibt WKNavigation * statt void zurück: [https://developer.apple.com/reference/webkit/wkwebview/1414954-loadrequest] – gyimi

+0

@gyimi Hum Ich habe nie so etwas gesagt. Ich bekomme Sie nicht Punkt –

+1

Sie kommentiert: "Dann jedes Mal, wenn Sie die Anfrage laden möchten, rufen Sie stattdessen diese Funktion: ' - (** void **) loadRequest: (NSURLRequest \ *) request' ". Das loadRequest von WKWebView gibt ** WKNavigation \ * ** statt ** void ** zurück. Was Sie geschrieben haben, funktioniert perfekt mit UIWebViews, aber die Eröffnungsfrage erwähnt WKWebViews. – gyimi