背景
我正在开发一个简单的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存储空间?
谢谢!
答案 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存储。你可以在这里很好地使用调度员。