2011-04-21 5 views
7

Necesito un botón de salir de mi aplicación, tengo el código de abajo:NSHTTPCookies se niegan a eliminar

 while ([[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies] count] != 0) { 
      for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) { 
       [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; 
      } 
     } 

(al mismo tiempo que está ahí para asegurarse de que se eliminan, sólo se ejecuta una vez sin embargo)

Si NSLog la descripción del almacenamiento compartido de cookies después del código anterior, indica que la matriz está vacía. Sin embargo, termino la aplicación o simplemente la cierro, y luego NSLog la descripción del almacenamiento compartido de cookies lo primero después de que se inicia la aplicación, todas las cookies todavía están allí.

He intentado fijar Cookie a cero en el bucle, e incluso trató de enviar dealloc a las cookies (sé que no debería hacer eso, pero ahora estoy tratando nada)

+0

Acabo de poner su código en mi proyecto actual. Primero dejé las cookies con 'NSLog (@"% @ ", [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]);' Luego ejecuté su código. Relanzar. Las cookies se han ido. ¡Extraño! –

+0

Me encuentro con este mismo problema y lo estoy investigando ahora. Está causando muchos conflictos cuando mi aplicación asume que ciertas cookies se han ido. – casey

+0

@casey, por favor publique de nuevo con sus hallazgos (también daré un representante adicional) –

Respuesta

1

He encontrado el siguiente código para trabajar

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
NSArray *cookieJar = [storage cookies]; 

for (NSHTTPCookie *cookie in cookieJar) 
{ 
    [storage deleteCookie:cookie]; 
} 
+0

La sugerencia de que esto simplemente funciona aparece en muchas publicaciones de SO, pero es bastante engañosa. La explicación de @ Kemenaran sobre cuándo funciona exactamente y cuándo no es crucial para comprender este problema y cómo probar todos los escenarios. – Nariman

3

El problema parece ser que las cookies se almacenan en caché y no se guardan en un archivo inmediatamente.

Si agrega una llamada al [storage _saveCookies], entonces funciona: se han ido para siempre, incluso si finaliza la aplicación inmediatamente después. Por supuesto, ese método es API privada, por lo que no te ayudará en la App Store. ¡Sería bueno encontrar la forma de activarlo!

También encontré que la siguiente API CoreFoundation funciona bien - pero por desgracia, no está expuesto por Apple, ya sea:

extern CFTypeRef _CFHTTPCookieStorageGetDefault(); 
extern void CFHTTPCookieStorageDeleteAllCookies(CFTypeRef storage); 
extern void CFHTTPCookieStorageSyncStorageNow(CFTypeRef storage); 

...

CFTypeRef storage = _CFHTTPCookieStorageGetDefault(); 
CFHTTPCookieStorageDeleteAllCookies(storage); 
CFHTTPCookieStorageSyncStorageNow(storage); 
+0

Rellené rdar: // 13293418 ([openradar] (http://openradar.appspot.com/radar?id=2776403)) para solicitar que esta API se haga pública; puedes completar un duplicado para darle un poco de peso. – Kemenaran

10

El problema parece ser que las cookies se almacenan en caché y no se guardan en un archivo de inmediato.

hice un sample project para reproducir este problema - y encontró que sólo ocurriría cuando la aplicación recibe una señal SIGKILL, como cuando el depurador se detiene dentro de Xcode. En mis experimentos, las excepciones no controladas, bloqueos, exit() y abort() no causan que NSHTPPCookieStorage pierda datos.

Como parece un problema de depuración (solo ocurre cuando se utiliza el depurador), cerré el radar que llené previamente.

No pude probar todo: no dude en utilizar el proyecto de ejemplo para ver si otra fuente de fallos puede provocar la pérdida de cookies.

+2

Muchas gracias @ Kemenaran, estaba totalmente perdido. Para probar las cookies, no elimine la aplicación de Xcode y elimine la aplicación del teléfono antes de iniciar esta aplicación desde Xcode. –

+0

Gracias, eso es todo. Para OSX: en lugar de detener la aplicación con Xcode, simplemente salga de ella (haga clic con el botón derecho en el ícono de la aplicación). Esto asegura que las cookies se guardan – sust86

Cuestiones relacionadas