2013-05-15 12 views
12

Konto
Pracuję nad prostą aplikacją na iPada, która umożliwia użytkownikowi przeglądanie tej samej witryny z różnymi loginami w tym samym czasie. Dlatego mam dwa UIWebView i powinny one mieć inne przechowywanie plików cookie, aby użytkownik mógł zalogować się na jedno konto na pierwszym UIWebView i inne konto na drugim UIWebView.Masz oddzielne miejsce przechowywania plików cookie dla dwóch UIWebView?

Co próbowałem? Myślę, że rozwiązaniem jest zaimplementowanie różnych magazynów plików cookie w dwóch posiadanych UIWebView.

Sasmito Adibowo napisał artykuł Implementing Your Own Cookie Storage, który zawiera szczegółowe informacje na temat używania niestandardowego magazynu plików cookie dla komputerów Macintosh WebView.
Dokonuje się tego, modyfikując NSURLRequest, który będzie wysyłać WebView, dodając do niego nagłówki plików cookie, a także przechwycić odpowiedź z WebView i wyodrębnić pliki cookie z nagłówka odpowiedzi i zapisać je w naszym własnym magazynie plików cookie.
Technicznie, że odbywa się to poprzez wdrożenie tych metod dwa Delegat:

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

Chociaż jest nieudokumentowane, UIWebView poparł jeden z powyższą metodą, z nieco inną nazwą metoda:

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

jednak UIWebView nie ma równoważnej metody delegowania dla webView:resource:didReceiveResponse:fromDataSource: i dlatego nie mogę wyodrębnić plików cookie z nagłówków odpowiedzi.

Pytanie
Czy istnieje sposób, aby mieć UIWebView użyć niestandardowego przechowywanie plików cookie, a więc dwa UIWebView może mieć własne przechowywanie ciasteczek?

Dzięki!

Odpowiedz

1

Czy próbowałeś coraz ciasteczka powiązane z konkretnym WebView (i trzymając nich) w webViewDidStartLoad:

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

i przechowywania tych plików zaraz po (pobieranie wartości i klucze z 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]; 

będziesz również trzeba zobaczyć w viewDidLoad:

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

w 'webViewDidStartLoad', żądanie jest już wysłane, dlatego twój hack nie działa. Przeniesienie go do 'shouldStartLoadWithRequest' może działać. Jednak twój hack nie pozwoli obu UIWebView załadować żądanie jednocześnie. – howanghk

+0

@bdev odpowiedź Chcę w Swift 3.0 może mi pomóc. –

0

Jeśli chcesz kopać nieco głębiej, znany już ASIHttpRequest wiedział, jak to zorganizować z powrotem w ciągu dnia. Przeczytaj switching cookie storage for requests. Mają także interesującą osłonę dla żądań UIWebView, AKA ASIWebPageRequest.

Niestety, projekt został przerwany, ale powinien zapewnić ci pole do działania, aby osiągnąć swój cel.

W przeciwnym razie, jak pokazałby bdev, za każdym razem ustawiałbym kolejkę żądań i zastępował przechowywanie plików cookie przed wystrzeleniem żądania. Można tutaj ładnie korzystać z dyspozytora.

Powiązane problemy