2012-01-19 21 views
5

Tengo un UIWebView que carga un sitio web que Autenticación de usuario. El sitio crea una cookie de autenticación. Cuando esté en el navegador, a menos que borre sus cookies, siempre estará conectado. Cuando el xCODE se carga, puede ver la cookie que figura en la lista cuando mira el contenedor de cookies, pero no se envía a la vista web. Me gustaría saber cómo hacer que la webView sepa que la cookie de autenticación está allí, por lo que no continúa solicitando autenticación al usuario cada vez.iOS UIwebView Auth Cookies

Respuesta

7

Puede usar la clase NSURLConnection para realizar una solicitud HTTP para iniciar sesión en el sitio web y recuperar la cookie. Para realizar una solicitud, simplemente cree una instancia de NSURLConnection y asígnele un objeto delegado.

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/"]]; 
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 

A continuación, implemente un método delegado.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response; 
    NSDictionary *fields = [HTTPResponse allHeaderFields]; 
    NSString *cookie = [fields valueForKey:"Set-Cookie"]; // It is your cookie 
} 

Conservar o copiar la cadena de cookies. Cuando desee realizar otra solicitud, agréguela a su encabezado HTTP de su instancia de NSURLRequest.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/"]]; 
[request addValue:cookie forHTTPHeaderField:"Cookie"]; 

para borrar cookies en cualquier momento puede llamar a este método:

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    for (NSHTTPCookie *each in [[[cookieStorage cookiesForURL:YOUR_URL] copy] autorelease]) { 
     [cookieStorage deleteCookie:each]; 
    } 
+0

Ok, Soy nuevo en Xcode y tengo algunas preguntas sobre esto. Siéntase libre de llamarme nombres si son demasiado simples. En el archivo AppDelegate.m, trato de declarar NSURL y NSURLConnection y obtuve un error de compilación sobre las constantes no de beign. Implementé el delegado también en AppDelagate.m y compila. El NSMutable No tengo idea de qué método debería ser. Estoy seguro de que estas son preguntas simples, pero realmente no sé. – Hector

2

He resuelto el problema. El problema tiene que ver con la configuración ya que UIWebView no se ve como un navegador web estándar. Estoy autenticando al usuario a través de .net e IIS. Agregué un archivo generic.browser en el directorio App_Browser de mi sitio web. El contenido del archivo es:

<browsers> 
    <browser refID="Mozilla" > 
    <capabilities> 
     <capability name="cookies" value="true" /> 
    </capabilities> 
    </browser> 
    <browser refID="Default"> 
     <capabilities> 
     <capability name="cookies" value="true" /> 
     </capabilities> 
    </browser> 
</browsers> 

la línea que corrige el problema es la capacidad de permitiendo que las cookies.

La referencia a la solución que utilicé fue esta

Asp.Net Forms Authentication when using iPhone UIWebView

4

se puede leer la cookie de autenticación de todos los sitios web mediante el almacenamiento de cookies compartido.

NSHTTPCookie *cookie; 

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
for (cookie in [cookieJar cookies]) 
{ 
    NSLog(@"%@", cookie); 
} 

O para obtener la cookie de aspxauth .NET para su sitio web

NSArray *cookiesForURL = [cookieJar cookiesForURL: [NSURL URLWithString: **MYURL**]]; 

for (cookie in cookiesForURL) 
{ 
    if([cookie.name compare:@".ASPXAUTH"] == NSOrderedSame) 
    { 
     NSLog(@"%@", cookie); 
     break; 
    } 
} 
Cuestiones relacionadas