2012-03-30 2 views
13

Я разрабатываю приложение для газетных киосков и использую NSURLRequest для загрузки активов эмиссии.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]; 
    .... 
} 

Когда первый цикл выполняется мое печенье, кажется, в NSHTTPCookieStorage, но когда фактические запросы направляются, нет никакой информации куки в заголовках. Я использую CharlesProxy, чтобы посмотреть, что. Может кто-нибудь, пожалуйста, дайте совет, что может вызвать эту проблему?

+0

Вы можете попробовать сделать это вручную: http://stackoverflow.com/questions/5954382/ios-is-it-possible-to -set-a-cookie-вручную-using-sharedhttpcookiestorage-for-a –

+0

Спасибо, я попробую это. –

ответ

18

От this thread, магия колдовство, как представляется:

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

(Внимание: непроверенный код.)

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

Как и в случае с the documentation, вы также можете проверить HTTPShouldHandleCookies, чтобы убедиться, что ваша политика cookie по умолчанию используется должным образом.

+1

Работает как босс, но вы должны заметить, что OP должен создать NSMutableURLRequest, чтобы иметь возможность использовать метод setAllHTTPHeaderFields. Просто измените 'NSURLRequest * запрос = [[NSURLRequest Alloc] initWithURL: contentURL];' к 'NSMutableURLRequest запрос * = [[NSMutableURLRequest Alloc] initWithURL: contentURL];' – RobP

+0

также, это похоже на большую возможность для категории и метода удобства, которые можно было бы использовать по строкам '[myMutableURLRequest addAllCookies]' – RobP

+0

Awesome +1 @MrGomez – mkabatek

1

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

+0

Спасибо, я тоже использую это, но я не мог найти способ заставить его работать с Newsstand Комплект. Вы знаете, могут ли они работать вместе? –

+0

Не уверен, я еще не использовал эту комбинацию. Вы можете узнать больше на http://allseeing-i.com/ASIHTTPRequest/How-to-use#persistent_cookies –

+1

ASIHTTPRequest больше не поддерживается Ben Copsey, который написал его (последнее обновление, май 2011 г.), и он рекомендует не использовать его для новые проекты – joneswah