2013-05-15 2 views
12

Hintergrund
Ich entwickle eine einfache iPad-Anwendung, die es dem Benutzer ermöglicht, die gleiche Website mit verschiedenen Logins gleichzeitig zu durchsuchen. Daher habe ich zwei UIWebView und sie sollten unterschiedliche Cookie-Speicher haben, so dass der Benutzer ein Konto auf der ersten UIWebView und ein anderes Konto auf der zweiten UIWebView anmelden kann.Mit separaten Cookie-Speicher für zwei UIWebView?

Was habe ich versucht?
Ich denke, die Lösung besteht darin, verschiedene Cookie-Speicher in den beiden UIWebView ich habe zu implementieren.

Sasmito Adibowo schrieb einen Artikel Implementing Your Own Cookie Storage, die Details zur Verwendung eines benutzerdefinierten Cookie-Speichers für WebView auf Mac bereitstellen.
Es wird durch Ändern der NSURLRequest, die WebView senden wird, Hinzufügen von Cookies Header, und abfangen der Antwort von WebView und extrahieren Sie die Cookies aus der Antwort-Header und speichern Sie es in unserem eigenen Cookie-Speicher.
Technisch wird es durch die Umsetzung dieser beiden Delegatmethoden getan:

- (void)webView:(WebView *)sender resource:(id)identifier didReceiveResponse:(NSURLResponse *)response fromDataSource:(WebDataSource *)dataSource 
- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource 

Obwohl es nicht dokumentiert ist, UIWebView tat Unterstützung eines der oben beschriebenen Methode mit einem etwas anderen Verfahren Name:

- (NSURLRequest *)uiWebView:(UIWebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(id)dataSource 

jedoch UIWebView haben keine entsprechende Delegate-Methode für webView:resource:didReceiveResponse:fromDataSource: und daher kann ich die Cookies aus den Antwortheadern nicht extrahieren.

Die Frage
Gibt es eine Möglichkeit UIWebView haben einen benutzerdefinierten Cookie-Speicher zu verwenden, so dass die beiden UIWebView kann seinen eigenen Cookie Speicher haben?

Danke!

Antwort

1

Haben Sie versucht, die Plätzchen mit einem bestimmten webview zugeordnet bekommen (und auf sie halten) in webViewDidStartLoad:

NSHTTPCookie *cookie; 
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
for (cookie in [cookieJar cookies]) { 
    [self.cookies addObject:cookie]; 
} 

Und diese Cookies direkt nach (Abrufen von Werten und Schlüssel aus self.cookies) Speichern:

NSMutableDictionary *cookieDict = [NSMutableDictionary dictionary]; 
[cookieDict setObject:@"value1" forKey:NSHTTPCookieName]; 
[cookieDict setObject:@"value2" forKey:NSHTTPCookieValue]; 
[cookieDict setObject:@"value3" forKey:NSHTTPCookieDomain]; 
...etc.. 

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieDict]; 
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; 

Sie werden auch diese in Ihrem viewDidLoad sehen müssen:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; 
+0

in 'webViewDidStartLoad', die Anfrage wurde bereits gesendet, daher hat Ihr Hack nicht funktioniert. Das Verschieben nach 'shouldStartLoadWithRequest' funktioniert möglicherweise. Ihr Hack lässt jedoch nicht zu, dass beide UIWebView-Anfragen gleichzeitig geladen werden. – howanghk

+0

@bdev antwort ich will in swift 3.0 kann mir helfen. –

0

Wenn Sie bereit sind, ein bisschen tiefer zu graben, wusste der berühmte ASIHttpRequest, wie man das heute wieder in Ordnung bringt. Gelesen switching cookie storage for requests. Sie haben auch einen interessanten Wrapper für UIWebView Anfragen, AKA ASIWebPageRequest.

Leider wurde das Projekt inzwischen eingestellt, aber es sollte Ihnen einen Operationsboden geben, um Ihr Ziel zu erreichen.

Andernfalls, wie bdev dargestellt hat, würde ich die Anfragen in die Warteschlange stellen und den Cookie-Speicher jedes Mal ersetzen, bevor eine Anfrage ausgelöst wird. Sie könnten den Dispatcher hier gut gebrauchen.