objective c - Estado de NSHTTPCookieStorage no guardado en la salida de la aplicación. ¿Algún conocimiento/documentación definitiva por ahí?
objective-c ios (3)
Luchando con este problema y reacio a implementar un sistema de administración de cookies personalizado.
Parece que algún nivel oculto de la implementación de HTTP de iOS no puede administrar correctamente las cookies sin sesión. Cada vez que una respuesta HTTP establece o elimina una cookie, la inspección inmediata de las cookies NSHTTPCookieStorage arrojará los resultados esperados e indicará el valor de sessionOnly correcto.
Pero si la aplicación se cierra poco después de que una respuesta actualice las cookies, al reiniciar esas cookies sessionOnly = FALSE se revertirán a algún estado anterior y se perderán las actualizaciones más recientes.
Si las cookies se establecen / eliminan mediante un encabezado de respuesta o NSHTTPCookieStorage setCookie: no hace diferencia.
Algo de caché / sincronización de vudú debe estar detrás de las escenas. El tiempo que tarda la cookie en volverse persistente puede ser de hasta 5 segundos.
¿ALGUIEN por ahí que tiene o puede señalar alguna explicación definitiva de este comportamiento? ¿Es un error, simple y llano? ¿O alguna característica no documentada cuyo propósito no puedo comprender?
Algún código que puede usar para reproducir:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
NSHTTPCookie *cookie;
for (cookie in [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies) {
NSLog(@"%@=%@", cookie.name, cookie.value);
}
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName];
[cookieProperties setObject:[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] 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
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];
cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
Este código debería generar un nuevo valor en cada lanzamiento. En cambio, verá que si sale de la aplicación rápidamente, el valor no cambia.
Algunas preguntas de desbordamiento de pila posiblemente relacionadas:
iphone NSHTTPCookieStorage disponible en la aplicación volver a abrir?
iPhone: NSHTTPCookie no se guarda en reinicios de la aplicación
Creo que la respuesta se encuentra en one de las publicaciones de SO a las que se vinculó en su pregunta:
Hice un proyecto de muestra para reproducir este problema, y descubrí que solo ocurriría cuando la aplicación recibe una señal SIGKILL, como cuando el depurador se detiene desde Xcode. En mis experimentos, las excepciones no controladas, bloqueos, exit () y abort () no causan que NSHTPPCookieStorage pierda datos.
Como esto parece un problema de depuración (solo ocurre cuando se usa el depurador), cerré el radar que llené previamente.
Puede probar esto reiniciando el teléfono normalmente y observando que todos los cambios a NSHTTPCookieStorage se conservan y se vuelven a cargar correctamente.
Parece que se requiere una llamada de "sincronización" NSUserDefaults al estilo subyacente. Creo que su mejor opción es administrar todas las cookies de su aplicación por separado en NSUserDefaults estándar y sincronizar las que faltan en NSHTTPCookieStorage al inicio. O mira si hay algún método de sincronización privado si te sientes valiente :)
También tengo el mismo problema, pero encontré una solución. Guardé las cookies a medida que el navegador las creaba y luego las recreaba a medida que la aplicación se reinicia.
1) Guarde las cookies cuando sean creadas por uiwebview.
NSMutableArray *cookieArray = [[NSMutableArray alloc] init];
for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
[cookieArray addObject:cookie.name];
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:cookie.name forKey:NSHTTPCookieName];
[cookieProperties setObject:cookie.value forKey:NSHTTPCookieValue];
[cookieProperties setObject:cookie.domain forKey:NSHTTPCookieDomain];
[cookieProperties setObject:cookie.path forKey:NSHTTPCookiePath];
[cookieProperties setObject:[NSNumber numberWithInt:cookie.version] forKey:NSHTTPCookieVersion];
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];
[[NSUserDefaults standardUserDefaults] setValue:cookieProperties forKey:cookie.name];
[[NSUserDefaults standardUserDefaults] synchronize];
}
[[NSUserDefaults standardUserDefaults] setValue:cookieArray forKey:@"cookieArray"];
[[NSUserDefaults standardUserDefaults] synchronize];
2) Ahora vuélvalos a crear cuando la aplicación se reinicie:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSMutableArray* cookieDictionary = [[NSUserDefaults standardUserDefaults] valueForKey:@"cookieArray"];
NSLog(@"cookie dictionary found is %@",cookieDictionary);
for (int i=0; i < cookieDictionary.count; i++)
{
NSLog(@"cookie found is %@",[cookieDictionary objectAtIndex:i]);
NSMutableDictionary* cookieDictionary1 = [[NSUserDefaults standardUserDefaults] valueForKey:[cookieDictionary objectAtIndex:i]];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieDictionary1];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
// other code
}
Gracias