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 для поиска. Может ли кто-нибудь дать совет, что может быть причиной этой проблемы?


person Alex Petrov    schedule 30.03.2012    source источник
comment
Вы можете попробовать сделать это вручную: stackoverflow.com/questions/5954382/   -  person Adam Shiemke    schedule 30.03.2012


Ответы (2)


Из этой темы магическое заклинание выглядит так:

NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:
  [cookieJar cookies]];
[request setAllHTTPHeaderFields:headers];

(Предупреждение: непроверенный код.)

Это преобразует ваш файл cookie в массив файлов cookie, затем в NSDictionary заголовков и, наконец, прикрепит эти заголовки к вашему запросу. Это сравнимо с выполнением этого вручную, как Адам Шимке упомянул в вопросе об ошибках, но, на мой взгляд, намного чище.

Согласно документации, вы также можете проверить HTTPShouldHandleCookies, чтобы убедиться, что ваша политика использования файлов cookie по умолчанию используется правильно.

person MrGomez    schedule 06.04.2012
comment
Работает как босс, но вы должны отметить, что OP должен создать NSMutableURLRequest, чтобы иметь возможность использовать метод setAllHTTPHeaderFields. Просто измените NSURLRequest *request = [[NSURLRequest alloc] initWithURL:contentURL]; на NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:contentURL]; - person RobP; 14.09.2014
comment
кроме того, это кажется отличной возможностью для категории и удобным методом, который можно использовать в соответствии с [myMutableURLRequest addAllCookies] - person RobP; 14.09.2014
comment
Отлично +1 @MrGomez - person mkabatek; 08.06.2016

В проектах iOS я нашел ASIHTTPRequest очень полезным для такого рода проблем. Он делает такие вещи, как аутентификация и файлы cookie, намного лучше, чем встроенные функции: http://allseeing-i.com/ASIHTTPRequest/

person Collin Kleine    schedule 07.04.2012
comment
Спасибо, я тоже использую это, но я не смог найти способ заставить его работать с Newsstand Kit. Вы не знаете, могут ли они работать вместе? - person Alex Petrov; 07.04.2012
comment
Не уверен, я еще не использовал эту комбинацию. Вы можете узнать больше на allseeing-i.com/ASIHTTPRequest/How-to- использовать#persistent_cookies - person Collin Kleine; 08.04.2012
comment
ASIHTTPRequest больше не поддерживается написавшим его Беном Копси (последнее обновление в мае 2011 г.), и он рекомендует не использовать его для новых проектов. - person joneswah; 31.01.2013
comment
Ага, сейчас перевожу все свои проекты на RestKit :) - person Alex Petrov; 13.03.2013