NSHTTPCookies refuse d'être supprimé

J'ai besoin d'un button de déconnection pour mon application, j'ai le code ci-dessous:

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

(le time est juste là pour s'assurer qu'ils sont supprimés, il ne fonctionne qu'une fois cependant)

Si je NSLog la description du stockage de cookie partagé après le code ci-dessus il affiche que le tableau est vide. Cependant, je termine l'application ou tout simplement la fermer, puis NSLog la description du stockage des cookies partagés la première chose après le démarrage de l'application, tous les cookies sont toujours là.

J'ai essayé de mettre Cookie à zéro dans la boucle for, et j'ai même essayé d'envoyer des dealloc aux cookies (je sais que vous ne devriez pas faire ça mais j'essaye maintenant n'importe quoi)

Le problème semble être que les cookies sont mis en cache et ne sont pas sauvegardés dans un file immédiatement.

J'ai fait un exemple de projet pour reproduire ce problème – et j'ai constaté qu'il ne se produirait que lorsque l'application recevrait un signal SIGKILL, comme lorsque le débogueur est arrêté depuis Xcode. Dans mes expériences, les exceptions non gérées, les plantages, exit () et abort () ne provoquent pas la perte de données par NSHTPPCookieStorage.

Comme cela ressemble à un problème de debugging uniquement (cela ne se produit que lorsque vous utilisez le débogueur), j'ai fermé le radar que j'ai rempli précédemment.

Cependant, je ne pouvais pas tout tester: n'hésitez pas à utiliser l'exemple de projet pour voir si une autre source de crash pourrait triggersr une perte de cookies.

Le problème semble être que les cookies sont mis en cache et ne sont pas sauvegardés dans un file immédiatement.

Si vous ajoutez un appel à [storage _saveCookies] alors cela fonctionne – ils sont [storage _saveCookies] , même si vous terminez l'application directement après. Bien sûr, cette méthode est une API privée, elle ne vous aidera donc pas sur l'App Store. Il serait bon de find un moyen de le triggersr!

J'ai également constaté que l'API CoreFoundation suivante fonctionne bien – mais malheureusement elle n'est pas non plus exposée par Apple:

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

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

J'ai trouvé le code suivant pour travailler.

 NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; NSArray *cookieJar = [storage cookies]; for (NSHTTPCookie *cookie in cookieJar) { [storage deleteCookie:cookie]; }