NSURLRequest не отправляет файлы cookie
Я разрабатываю приложение для газетных журналов и использую NSURLRequest для загрузки ресурсов эмиссии.
NSArray *contents = [issue.tableOfContents objectForKey:kSNTableOfContentsContents];
NSHTTPCookie *cookie;
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSLog(@"HERE GO MY COOKIES");
for (cookie in [cookieJar cookies]) {
NSLog(@"%@", cookie);
}
for (NSDictionary *contentItem in contents) {
NSString *contentURL_string = [contentItem objectForKey:kSNTableOfContentsRemoteURL];
NSURL *contentURL = [NSURL URLWithString:contentURL_string];
NSString *fileName = [contentItem objectForKey:kSNTableOfContentsContentsURL];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:contentURL];
NKAssetDownload *asset = [newsstandIssue addAssetWithRequest:request];
[request release];
....
[asset downloadWithDelegate:self];
....
}
Когда выполняется первый цикл for, мои файлы cookie выглядят в NSHTTPCookieStorage, но когда отправляются фактические запросы, в заголовках нет информации о файлах cookie. Я использую CharlesProxy, чтобы посмотреть на это. Может кто-нибудь, пожалуйста, дайте несколько советов, что может вызвать эту проблему?
Ответы
Ответ 1
Из этой темы магическое заклинание выглядит следующим образом:
NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:
[cookieJar cookies]];
[request setAllHTTPHeaderFields:headers];
(Предупреждение: непроверенный код.)
Это преобразует ваш кувшин cookie в массив куки файлов, а затем в NSDictionary
заголовков и, наконец, скрепляет эти заголовки по вашему запросу. Это сопоставимо с выполнением этого вручную, так как Адам Шиемке связан в вопросе об ошибках, но гораздо чище, на мой взгляд.
В соответствии с документацией вы также можете проверить HTTPShouldHandleCookies
, чтобы убедиться, что ваша политика cookie по умолчанию используется должным образом.
Ответ 2
В проектах iOS я нашел ASIHTTPRequest очень полезным для подобных проблем. Он делает такие вещи, как аутентификация и файлы cookie, намного лучше, чем встроенные функции:
http://allseeing-i.com/ASIHTTPRequest/