Иметь отдельное хранилище cookie для двух UIWebView?

Фон
Я занимаюсь разработкой простого приложения для iPad, которое позволяет пользователю одновременно просматривать один и тот же веб-сайт с разными именами входа. Поэтому у меня есть два UIWebView и они должны иметь различное хранилище cookie, чтобы пользователь мог войти в одну учетную запись на первом UIWebView и еще один аккаунт на втором UIWebView,

Что я пробовал?
Я думаю, что решение состоит в том, чтобы внедрить разные хранилища cookie в двух UIWebView Я имею.

Сасмито Адибово написал статью " Реализация собственного хранилища файлов cookie", в которой подробно рассказывается, как использовать собственное хранилище файлов cookie для WebView на Mac.
Это делается путем изменения NSURLRequest, что WebView собирается отправить, добавив к нему заголовки 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: и, следовательно, я не могу извлечь куки из заголовков ответа.

Вопрос
Есть ли способ иметь UIWebView использовать собственное хранилище cookie, поэтому два UIWebView может иметь свое собственное хранилище печенья?

Спасибо!

2 ответа

Вы пытались получить файлы cookie, связанные с определенным веб-просмотром (и удерживая их) в webViewDidStartLoad:

NSHTTPCookie *cookie;
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [cookieJar cookies]) {
    [self.cookies addObject: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];

Если вы хотите копнуть немного глубже, известный вам ASIHttpRequest знал, как это устроить в тот день. Прочитайте переключение хранения файлов cookie для запросов. У них также есть интересная оболочка для запросов UIWebView, AKA ASIWebPageRequest.

К сожалению, проект с тех пор был прекращен, но он должен предоставить вам основу для достижения вашей цели.

В противном случае, как представил bdev, я бы помещал запросы в очередь и каждый раз заменял бы хранилище cookie, прежде чем запускать запрос. Вы можете использовать диспетчер красиво здесь.

Другие вопросы по тегам