Можно ли установить cookie вручную с помощью sharedHTTPCookieStorage для UIWebView?
У меня есть веб-просмотры внутри приложения iOS, которые требуют проверки подлинности cookie для правильной проверки подлинности. Я ищу способ установить файл cookie внутри webview приложения iOS без необходимости делать исходящий запрос на установку файла cookie, поскольку у меня уже есть информация auth на клиенте.
этой post показывает нам, где хранятся файлы cookie UIWebView.
прямо сейчас я загружаю скрытый веб-вид, чтобы сделать исходящий запрос, но предпочел бы не делать внешний запрос на установку простого файла cookie.
4 ответа:
Да, вы можете сделать это. Во-первых, в applicationDidBecomeActive добавьте эту строку
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
cookieAcceptPolicy является общим для всех приложений и может быть изменен без вашего ведома, так что вы хотите быть уверены, что у вас есть политика принятия вам нужно каждый раз, когда ваше приложение работает.
затем, чтобы установить куки:
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary]; [cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName]; [cookieProperties setObject:@"someValue123456" forKey:NSHTTPCookieValue]; [cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieDomain]; [cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieOriginURL]; [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath]; [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion]; // set expiration to one month from now or any NSDate of your choosing // this makes the cookie sessionless and it will persist across web sessions and app launches /// if you want the cookie to be destroyed when your app exits, don't set this [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires]; NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties]; [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
этот файл cookie имеет имя testCookie и значение someValue123456 и будет отправлен с любым http-запросом www.example.com.
для одного большого предостережения к установке куки, пожалуйста, смотрите мой вопрос здесь!
Edit: адаптация для отредактированного вопроса
NSHTTPCookieStorage
есть-setCookies:forURL:mainDocumentURL:
метод, так что легко сделать, это использоватьNSURLConnection
и реализовать-connection:didReceiveResponse:
, извлекая печенье и запихивая его в банку для печенья:- ( void )connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; NSArray *cookies; cookies = [ NSHTTPCookie cookiesWithResponseHeaderFields: [ httpResponse allHeaderFields ]]; [[ NSHTTPCookieStorage sharedHTTPCookieStorage ] setCookies: cookies forURL: self.url mainDocumentURL: nil ]; }
(вы также можете просто извлечь
NSDictionary
объектNSHTTPCookie
Сproperties
, а затем записать словарь на диск. Чтение его обратно так же просто, как с помощьюNSDictionary
' s-dictionaryWithContentsOfFile:
а затем создание файла cookie с помощью-initWithProperties:
.)затем вы можете вытащить печенье из хранилища, когда вам это нужно:
- ( void )reloadWebview: (id)sender { NSArray *cookies; NSDictionary *cookieHeaders; NSMutableURLRequest *request; cookies = [[ NSHTTPCookieStorage sharedHTTPCookieStorage ] cookiesForURL: self.url ]; if ( !cookies ) { /* kick off new NSURLConnection to retrieve new auth cookie */ return; } cookieHeaders = [ NSHTTPCookie requestHeaderFieldsWithCookies: cookies ]; request = [[ NSMutableURLRequest alloc ] initWithURL: self.url ]; [ request setValue: [ cookieHeaders objectForKey: @"Cookie" ] forHTTPHeaderField: @"Cookie" ]; [ self.webView loadRequest: request ]; [ request release ]; }
в Swift 3 все ключи завернуты в
HTTPCookiePropertyKey
struct:let cookieProperties: [HTTPCookiePropertyKey : Any] = [.name : "name", .value : "value", .domain : "www.example.com", .originURL : "www.example.com", .path : "/", .version : "0", .expires : Date().addingTimeInterval(2629743) ] if let cookie = HTTPCookie(properties: cookieProperties) { HTTPCookieStorage.shared.setCookie(cookie) }
необходимо обойти ограничения на куки, введенные iOS 10, что делает их невидимыми для различных процессов.
Это означает, что на устройствах с возможностью многопроцессорной обработки webviews-это отдельный процесс, а затем ваше приложение, что означает, что ваш сеанс "приложение" больше не передается автоматически в webview.
таким образом, в сущности, вам нужно будет это сделать (даже предыдущие плакаты, где правильно, он работал автоматически до iOS10).