2012-02-12 7 views
11

Estoy intentando crear un inicio de sesión en mi aplicación de iPhone.¿Cómo configurar una cookie con una solicitud NSURL?

NSURL *urlNew = [NSURL URLWithString:urlstring]; 
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:urlNew]; 
NSString *msgLength = [NSString stringWithFormat:@"%d", [parameterString length]]; 
[theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"]; 
[theRequest setHTTPMethod:@"POST"]; 
[theRequest setValue:length forHTTPHeaderField:@"Content-Length"]; 
[theRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[theRequest setHTTPBody: httpbody]; 

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES]; 

[connection start]; 

Esa es la forma en que publico mis datos en el Servidor, funciona - recibo una respuesta. El problema es que la respuesta es el código del lado de inicio de sesión, no el código del área "guardada". Creo que tengo que crear cookies, para que el sitio web sepa, que estoy conectado.

He buscado en Internet, pero no encontré nada útil. Entonces, ¿cómo creo una cookie cuando inicio sesión? ¿Tengo que publicar esta cookie cada vez que voy a otro enlace en el área "guardada"?

Espero que puedas entender mi problema.

Greetz

+0

debe cambiar su pregunta de "¿Cómo conseguir una cookie con una solicitud NSURL? " ya que dijiste que quieres que la cookie existente no cree una nueva. – Maziyar

Respuesta

27

Prueba este

[theRequest setValue:@"myCookie" forHTTPHeaderField:@"Cookie"]; 

Editar:

PO quiere saber cómo crear una cookie. Así que aquí hay un código de

NSDictionary *cookieProperties = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"domain.com", NSHTTPCookieDomain, 
         @"\\", NSHTTPCookiePath, 
         @"myCookie", NSHTTPCookieName, 
         @"1234", NSHTTPCookieValue, 
         nil]; 
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties]; 
NSArray* cookieArray = [NSArray arrayWithObject:cookie]; 
NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookieArray]; 
[request setAllHTTPHeaderFields:headers]; 
+0

Gracias, pero no lo entiendo. Para "myCookie" tengo que completar algo? – Schmarsi

+0

La primera vez que inicio sesión, tengo que crear una cookie, pensé. Para cargar otro enlace, tengo que enviar esta cookie creada con la solicitud, ¿verdad? ¿Cómo manejo esto? – Schmarsi

+0

Ver el código editado arriba. – mbh

4

no está seguro de que sigue siendo relevante, pero en caso de que alguien encontrar que útil, aquí es como se obtiene de las galletas después de hacer una petición. Debe implementar el selector connectionDidFinishLoading: en el objeto que se especificó como delegado a NSURLConnection (auto en su caso):

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES]; 

en este connectionDidFinishLoading: selector se puede acceder a las cookies de esa manera:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSHTTPCookieStorage * storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    NSArray * cookies = [storage cookiesForURL:connection.currentRequest.URL]; 
    for (NSHTTPCookie * cookie in cookies) 
    { 
     NSLog(@"%@=%@", cookie.name, cookie.value); 
     // Here you can store the value you are interested in for example 
    } 
} 

, posteriormente, este valor almacenado se puede utilizar en las solicitudes de esta manera:

[request setValue:[NSString stringWithFormat:@"%@=%@", cookieName, cookieValue] forHTTPHeaderField:@"Cookie"]; 

o más avanzado setAllHTTPHeaderFields:, pero recuerde utilizar el valor correcto en NSHTTPCookiePath campo, ver los detalles here

también NSHTTPCookieStorage tiene selector de -setCookies:forURL:mainDocumentURL: que también puede ser usado para establecer cookies.

2

Tuve el mismo problema con un WKWebView mostrando la cookie en una página PHP en la carga inicial pero la cookie se borró cuando la página se recargó/actualizó. Esto es lo que hice para que funcione.

Mi WKWebView con la configuración de cookies:

WKWebViewConfiguration *webViewConfig = [[WKWebViewConfiguration alloc] init]; // empty for now 
_awesomeWebView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:webViewConfig]; 
_awesomeWebView.UIDelegate = self; 
[self.view addSubview:_awesomeWebView]; 

NSString *url = @"https://phpwebsitewithcookiehandling.com"; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; 

// set all the cookies from my NSHTTPCookieStorage in the WKWebView too 
[request setHTTPShouldHandleCookies:YES]; 
[request setAllHTTPHeaderFields:[NSHTTPCookie requestHeaderFieldsWithCookies:[NSHTTPCookieStorage sharedHTTPCookieStorage].cookies]]; 

// set the cookie on the initial load 
NSString *cookie = @"status=awesome"; 
[request setValue:cookie forHTTPHeaderField:@"Cookie"]; 
NSLog(@"cookie set in WKwebView header: %@", cookie); 

[_awesomeWebView loadRequest:request]; 

En mi phpwebsitewithcookiehandling.com que utiliza lo siguiente para verificar que funcionaba:

<?php 
    echo "<li>status is: " . $_COOKIE['status']; 

    // Here comes the magic which set the servers SET-COOKIE header (apparently) so it works on consecutive page loads 
    setcookie('status', $_COOKIE['status'], time() + (86400 * 30), '/'); 

    echo '<li><a href="">Blank reload</a>'; 
    echo '<li><a href="#" onclick="location.reload(true);">Javascript reload</a>'; 

    exit; 
?> 

Funcionó para mí después de mucho ensayo y error. Buena suerte.:)

0

existe código fuente para extraer cadena de cookie de NSHTTPURLResponse:

static NSString *CookieFromResponse(NSHTTPURLResponse *response) { 
    NSArray<NSHTTPCookie *> *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:response.allHeaderFields forURL:response.URL]; 

    NSMutableString *cookieStr = [NSMutableString string]; 
    for (NSHTTPCookie *cookie in cookies) { 
     if (cookieStr.length) { 
      [cookieStr appendString:@"; "]; 
     } 
     [cookieStr appendFormat:@"%@=%@", cookie.name, cookie.value]; 
    } 
    return cookieStr.length ? cookieStr : nil; 
} 

y para establecer la cadena de galletas para NSMutableURLRequest:

NSString *cookieStr = CookieFromResponse(response); 
[request addValue:cookieStr forHTTPHeaderField:@"Cookie"]; 
Cuestiones relacionadas