2013-05-15 13 views
12

Sfondo
Sto sviluppando una semplice applicazione per iPad che consente all'utente di navigare nello stesso sito Web con accessi diversi allo stesso tempo. Pertanto ho due UIWebView e dovrebbero avere una diversa memorizzazione dei cookie in modo che l'utente possa accedere a un account sul primo UIWebView e un altro account sul secondo UIWebView.Disporre di una memoria cookie separata per due UIWebView?

Cosa ho provato?
Penso che la soluzione sia implementare diversi archivi di cookie nei due UIWebView che ho.

Sasmito Adibowo ha scritto un articolo Implementing Your Own Cookie Storage che fornisce dettagli su come utilizzare una memoria cookie personalizzata per WebView su Mac.
Si esegue modificando NSURLRequest che WebView sta per inviare, aggiungendo intestazioni di cookie ad esso, e anche intercettare la risposta da WebView ed estrarre i cookie dall'intestazione di risposta e salvarlo nella nostra memoria dei cookie.
Tecnicamente, è fatto mediante l'attuazione di questi metodi due delegato:

- (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 

Anche se è documentato, UIWebView fatto sostegno uno del metodo sopra con un leggermente diverso nome di metodo:

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

Tuttavia, UIWebView non hanno un metodo delegato equivalente per webView:resource:didReceiveResponse:fromDataSource: e quindi non riesco a estrarre i cookie dalle intestazioni di risposta.

La questione
C'è un modo per avere UIWebView utilizzare una memorizzazione dei cookie personalizzato, così i due UIWebView può avere il proprio memorizzazione dei cookie?

Grazie!

risposta

1

Hai provato ottenere i cookie associati a un particolare WebView (e tenendo premuto su di loro) in webViewDidStartLoad:

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

e memorizzare questi cookie subito dopo (recuperare i valori e le chiavi dal self.cookies):

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

Avrete anche bisogno di vedere questo nel vostro viewDidLoad:

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

in 'webViewDidStartLoad', la richiesta è già stata inviata, quindi il tuo hack non ha funzionato. Spostarlo in 'shouldStartLoadWithRequest' potrebbe funzionare. Tuttavia, il tuo trucco non consentirà ad UIWebView di caricare simultaneamente la richiesta. – howanghk

+0

@bdev risposta Voglio in swift 3.0 può aiutarmi. –

0

Se sei disposto a scavare un po 'più a fondo, il famoso successore ASIHttpRequest sapeva come sistemarlo nel corso della giornata. Leggi switching cookie storage for requests. Hanno anche un interessante wrapper per le richieste di UIWebView, AKA ASIWebPageRequest.

Purtroppo il progetto è stato interrotto, ma dovrebbe fornire una base operativa per raggiungere il tuo obiettivo.

In caso contrario, come bdev ha presentato, accoderei le richieste e sostituirò la memorizzazione dei cookie ogni volta, prima di attivare una richiesta. Potresti usare il dispatcher gentilmente qui.

Problemi correlati