背景
我正在开发一个简单的iPad应用程序,允许用户同时浏览不同登录的同一网站.因此,我有两个UIWebView,他们应该有不同的cookie存储,所以用户可以登录一个帐户在第一个UIWebView和第二个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存储?
谢谢!
解决方法
您是否尝试在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];