tutorial open example crear objective-c ios uiwebview

objective-c - open - uiwebview tutorial



¿Es posible establecer una cookie manualmente usando sharedHTTPCookieStorage para un UIWebView? (4)

Tengo vistas de web dentro de una aplicación de iOS que requieren una autenticación de cookie para ser debidamente autenticada. Estoy buscando una forma de establecer una cookie dentro de la vista web de una aplicación iOS sin tener que realizar una solicitud de salida para establecer la cookie ya que ya tengo información de autenticación en el cliente.

Esta post nos muestra dónde se almacenan las cookies de UIWebView.

En este momento estoy cargando una vista web oculta para hacer una solicitud de salida, pero preferiría no tener que realizar una solicitud externa para configurar una cookie simple.


En Swift 3, todas las claves están HTTPCookiePropertyKey en la estructura HTTPCookiePropertyKey :

let cookieProperties: [HTTPCookiePropertyKey : Any] = [.name : "name", .value : "value", .domain : "www.example.com", .originURL : "www.example.com", .path : "/", .version : "0", .expires : Date().addingTimeInterval(2629743) ] if let cookie = HTTPCookie(properties: cookieProperties) { HTTPCookieStorage.shared.setCookie(cookie) }


Es necesario evitar las limitaciones de las cookies introducidas por iOS 10, lo que las hace invisibles para diferentes procesos.

Esto significa que en los dispositivos con capacidad de multiprocesamiento, las vistas web son un proceso distinto que su aplicación, lo que significa que su sesión de "aplicación" ya no se transmite automáticamente a la vista web.

Entonces, en esencia, tendrás que hacerlo (incluso en los carteles anteriores donde estaba bien, estaba trabajando automáticamente antes de iOS10).


Sí, usted puede hacer esto. Primero, en applicationDidBecomeActive agregue esta línea

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

El cookieAcceptPolicy se comparte entre las aplicaciones y puede modificarse sin su conocimiento, por lo que debe asegurarse de tener la política de aceptación que necesita cada vez que se ejecuta su aplicación.

Luego, para configurar la cookie:

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary]; [cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName]; [cookieProperties setObject:@"someValue123456" forKey:NSHTTPCookieValue]; [cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieDomain]; [cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieOriginURL]; [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath]; [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion]; // set expiration to one month from now or any NSDate of your choosing // this makes the cookie sessionless and it will persist across web sessions and app launches /// if you want the cookie to be destroyed when your app exits, don''t set this [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires]; NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties]; [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

Esta cookie tiene el nombre testCookie y valora someValue123456 y se enviará con cualquier solicitud http a www.example.com.

Para una gran advertencia a la configuración de cookies, por favor vea mi pregunta aquí!

Estado de NSHTTPCookieStorage no guardado en la salida de la aplicación. ¿Algún conocimiento / documentación definitiva por ahí?


Edición: adaptación para la pregunta editada

NSHTTPCookieStorage tiene un -setCookies:forURL:mainDocumentURL: así que lo más fácil es usar NSURLConnection e implementar -connection:didReceiveResponse: extrayendo cookies y metiéndolas en el -connection:didReceiveResponse: cookies:

- ( void )connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; NSArray *cookies; cookies = [ NSHTTPCookie cookiesWithResponseHeaderFields: [ httpResponse allHeaderFields ]]; [[ NSHTTPCookieStorage sharedHTTPCookieStorage ] setCookies: cookies forURL: self.url mainDocumentURL: nil ]; }

(También puede extraer un objeto NSDictionary de NSHTTPCookie con properties y luego escribir el diccionario en el disco. -dictionaryWithContentsOfFile: nuevo es tan fácil como usar NSDictionary ''s -dictionaryWithContentsOfFile: y luego crear la cookie con -initWithProperties: )

Luego puede sacar la cookie del almacenamiento cuando lo necesite:

- ( void )reloadWebview: (id)sender { NSArray *cookies; NSDictionary *cookieHeaders; NSMutableURLRequest *request; cookies = [[ NSHTTPCookieStorage sharedHTTPCookieStorage ] cookiesForURL: self.url ]; if ( !cookies ) { /* kick off new NSURLConnection to retrieve new auth cookie */ return; } cookieHeaders = [ NSHTTPCookie requestHeaderFieldsWithCookies: cookies ]; request = [[ NSMutableURLRequest alloc ] initWithURL: self.url ]; [ request setValue: [ cookieHeaders objectForKey: @"Cookie" ] forHTTPHeaderField: @"Cookie" ]; [ self.webView loadRequest: request ]; [ request release ]; }