Подтвердить что ты не робот

Имеете отдельное хранилище файлов 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?

Спасибо!

4b9b3361

Ответ 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 каждый раз, прежде чем запускать запрос. Здесь вы можете использовать диспетчер.