12

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

我尝试了什么?我认为解决方案是在我拥有
的两个中实现不同的 cookie 存储。UIWebView

Sasmito Adibowo 写了一篇文章实现您自己的 Cookie 存储,其中提供了有关如何WebView在 Mac 上使用自定义 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 存储?

谢谢!

4

2 回答 2

1

您是否尝试过在 webViewDidStartLoad 中获取与特定 webview 关联的 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];
于 2013-07-17T04:22:56.370 回答
0

如果您愿意深入挖掘,曾经著名的ASIHttpRequest知道如何安排这一点。读取为请求切换 cookie 存储。他们还有一个有趣的 UIWebView 请求包装器,AKA ASIWebPageRequest

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

否则,正如 bdev 所展示的,我会在每次触发请求之前对请求进行排队并替换 cookie 存储。您可以在这里很好地使用调度程序。

于 2013-07-22T09:08:32.713 回答