Иметь отдельное хранилище 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, прежде чем запускать запрос. Вы можете использовать диспетчер красиво здесь.