2012-03-30 10 views
13

Estoy desarrollando una aplicación de quiosco de prensa y uso NSURLRequest para descargar elementos de la emisión.NSURLRequest no envía cookies

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]; 
    .... 
} 

Cuando el primer bucle se ejecuta mis galletas parecen estar en NSHTTPCookieStorage, pero cuando se envían las solicitudes reales, no hay información de la cookie en los encabezados. Yo uso CharlesProxy para buscarlo. ¿Podría alguien dar algunos consejos sobre lo que podría estar causando este problema?

+0

Puede intentar hacerlo manualmente: http://stackoverflow.com/questions/5954382/ios-is-it-possible-to -set-a-cookie-manualmente-using-sharedhttpcookiestorage-for-a –

+0

Gracias, intentaré eso. –

Respuesta

18

De this thread, el encantamiento mágico parece ser:

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

(Advertencia: código no probado.)

Esto convertirá su caja de galletas en una matriz de galletas, a continuación, a un NSDictionary de cabeceras y, por último, engrape esos encabezados a su pedido. Esto es comparable a hacerlo manualmente, como lo relacionó Adam Shiemke en la pregunta errata, pero mucho más limpio en mi opinión.

Según the documentation, es posible que también desee comprobar HTTPShouldHandleCookies para ver si su política de cookies predeterminada se está utilizando correctamente.

+1

Funciona como un jefe, pero debe tener en cuenta que el OP debe crear una NSMutableURLRequest para poder utilizar el método setAllHTTPHeaderFields. Basta con cambiar 'NSURLRequest * petición = [[NSURLRequest alloc] initWithURL: contentURL];' a 'NSMutableURLRequest * petición = [[NSMutableURLRequest alloc] initWithURL: contentURL];' – RobP

+0

también, esto parece una gran oportunidad para una categoría, y un método de conveniencia que se podría usar en la forma de '[myMutableURLRequest addAllCookies]' – RobP

+0

Impresionante +1 @MrGomez – mkabatek

1

En los proyectos de iOS, encontré la ASIHTTPRequest muy útil para este tipo de problemas. Hace cosas como la autenticación y las cookies mucho mejor que las funciones integradas: http://allseeing-i.com/ASIHTTPRequest/

+0

Gracias, yo uso esto también, pero no pude encontrar la manera de hacerlo funcionar con Kiosco Equipo. ¿Sabes si pueden trabajar juntos? –

+0

No estoy seguro, todavía no he usado esta combinación. Puede encontrar más información en http://allseeing-i.com/ASIHTTPRequest/How-to-use#persistent_cookies –

+1

ASIHTTPRequest ya no es compatible con Ben Copsey, quien lo escribió (última actualización, mayo de 2011) y recomienda no usarlo para nuevos proyectos – joneswah