2013-05-15 52 views
12

背景
我正在開發一個簡單的iPad應用程序,允許用戶在同一時間用不同的登錄名瀏覽同一個網站。因此,我有兩個UIWebView,他們應該有不同的cookie存儲,以便用戶可以登錄第一個UIWebView上的一個帳戶和第二個UIWebView上的另一個帳戶。爲兩個UIWebView分開存儲cookie嗎?

我試過了什麼?
我認爲解決方案是在我擁有的兩個UIWebView中實現不同的cookie存儲。

Sasmito Adibowo寫了一篇文章Implementing Your Own Cookie Storage,其中提供了有關如何在Mac上爲WebView使用自定義Cookie存儲的詳細信息。
這是通過修改WebView要發送的NSURLRequest完成的,向它添加cookie標頭,並攔截來自WebView的響應,並從響應頭中提取cookie並將其保存到我們自己的cookie存儲中。

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

雖然無證,UIWebView沒有支持上面略有不同的方法名的方法之一:
從技術上講,它是通過實現這兩個委託方法做

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

然而, UIWebView沒有與webView:resource:didReceiveResponse:fromDataSource:等效的代理方法,因此我無法從響應頭中提取cookie。

問題
有沒有辦法有UIWebView使用自定義的cookie存儲,所以這兩個UIWebView可以有自己的cookie存儲?

謝謝!

回答

1

你試過獲得與特定網頁視圖相關的Cookie(並持有到他們)在webViewDidStartLoad:

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

,右後(檢索self.cookies值和鍵),存儲這些cookie:

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

您還需要看到這個在您的viewDidLoad中:

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

in'webViewDidStartLoad',請求已經發送,因此你的黑客無法正常工作。將它移動到'shouldStartLoadWithRequest'可能會起作用。但是,你的破解不會允許兩個UIWebView同時加載請求。 – howanghk

+0

@bdev答案我想在迅速3.0可以幫助我。 –

0

如果您願意深入挖掘,那麼以前着名的ASIHttpRequest知道如何在當天安排回來。 閱讀switching cookie storage for requests。 他們也有一個有趣的UIWebView請求包裝,AKA ASIWebPageRequest

不幸的是,該項目已經停止,但它應該爲您提供一個操作基地來實現您的目標。

否則,如bdev所示,我會在發出請求之前將請求排隊並替換cookie存儲。你可以在這裏很好地使用調度器。