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

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

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

Sasmito Adibowo написал статью Внедрение собственного хранилища файлов 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: и, следовательно, я не могу извлечь файлы cookie из заголовков ответов.

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

Спасибо!

Ответ 1

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

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];

Вам также нужно увидеть это в вашем представленииDidLoad:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

Ответ 2

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

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

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