为两个UIWebView分别存储cookie?

时间:2013-05-15 07:42:25

标签: ios objective-c cookies uiwebview

背景
我正在开发一个简单的iPad应用程序,允许用户同时浏览具有不同登录的同一网站。因此,我有两个UIWebView,他们应该有不同的Cookie存储空间,因此用户可以在第一个UIWebView上登录一个帐户,在第二个UIWebView上登录另一个帐户。

我尝试了什么?
我认为解决方案是在我拥有的两个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存储空间?

谢谢!

2 个答案:

答案 0 :(得分:1)

您是否尝试过在webViewDidStartLoad中获取与特定网页浏览相关联的Cookie(以及保留它们):

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

然后立即存储这些cookie(从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];

您还需要在viewDidLoad中看到这一点:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

答案 1 :(得分:0)

如果你愿意深入挖掘一下,那个曾经有名的ASIHttpRequest知道如何在当天安排这个。 阅读switching cookie storage for requests。  他们还有一个有趣的UIWebView请求包装器,AKA ASIWebPageRequest

可悲的是,该项目已经停止,但它应该为您提供一个实现目标的操作基础。

否则,正如bdev所示,我会在发出请求之前将请求排队并每次更换cookie存储。你可以在这里很好地使用调度员。