Можно ли настроить cookie вручную с помощью sharedHTTPCookieStorage для UIWebView?
У меня есть веб-просмотр внутри приложения iOS, для которого требуется, чтобы файл cookie аутентификации был правильно аутентифицирован. Я ищу способ установить куки файл внутри веб-обозревателя приложения iOS без необходимости делать исходящий запрос для установки файла cookie, поскольку у меня уже есть информация о нем на клиенте.
Этот пост показывает нам, где хранятся файлы cookie UIWebView.
Сейчас я загружаю скрытый веб-просмотр, чтобы сделать исходящий запрос, но предпочел бы не делать внешний запрос для установки простого файла cookie.
Ответы
Ответ 1
Да, вы можете это сделать. Во-первых, в applicationDidBecomeActive добавьте эту строку
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
CookieAcceptPolicy используется совместно с приложениями и может быть изменена без вашего ведома, поэтому вы должны быть уверены, что вам нужна политика принятия при каждом запуске приложения.
Затем, чтобы установить файл cookie:
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.
Для одного большого предостережения для настройки файлов cookie, пожалуйста, ознакомьтесь с моим вопросом здесь!
Состояние NSHTTPCookieStorage не сохраняется при выходе из приложения. Какие-либо окончательные знания/документация там?
Ответ 2
Изменить: адаптация для редактируемого вопроса
NSHTTPCookieStorage
имеет метод -setCookies:forURL:mainDocumentURL:
, поэтому легко использовать NSURLConnection
и реализовать -connection:didReceiveResponse:
, извлекая файлы cookie и набивая их в банку cookie:
- ( 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
-dictionaryWithContentsOfFile:
, а затем создавая файл cookie с -initWithProperties:
.)
Затем вы можете вытащить файл cookie из хранилища, когда вам это нужно:
- ( 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 ];
}
Ответ 3
В Swift 3 все ключи завернуты в структуру HTTPCookiePropertyKey
:
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)
}
Ответ 4
Необходимо обойти ограничения на куки, введенные iOS 10, что делает их невидимыми для разных процессов.
Это означает, что на устройствах с возможностью многопроцессорности веб-просмотры представляют собой отдельный процесс, а затем ваше приложение, что означает, что сеанс "приложения" больше не передается в веб-просмотр.
Итак, в сущности, вам нужно будет это сделать (даже это предыдущие плакаты, где правильно, он работал автоматически до iOS10).