54 votes

Etat NSHTTPCookieStorage non enregistré à la sortie de l'application. Toute connaissance / documentation définitive sur le marché?

Aux prises avec ce problème et de la réticence à mettre en œuvre un cookie personnalisé système de gestion.

Il semble que certaines caché niveau de iOS mise en œuvre du protocole HTTP ne parvient pas à gérer sessionless les cookies correctement. Tout moment une réponse HTTP définit ou supprime un cookie, inspection immédiate de NSHTTPCookieStorage cookies donnera les résultats escomptés et indiquer le bon sessionOnly valeur.

Mais si l'application se ferme peu de temps après la réponse des mises à jour de cookies, à relancer ceux sessionOnly=FALSE cookies seront remis pour certaines à l'état précédent et les plus récentes mises à jour de perdu.

Si les cookies sont définis/supprimé par un en-tête de réponse ou NSHTTPCookieStorage setCookie: ne fait aucune différence.

Certains de cache et de la synchronisation de voodoo doit être passe derrière les coulisses. Le temps qu'il faut pour que le cookie devenir persistante peut être jusqu'à 5 secondes.

Toute PERSONNE qui a ou peut pointer vers une explication définitive de ce problème? Est-ce un bug, clair et simple? Ou certaines fonctions non documentées dont le but, je ne peux pas comprendre?

Un peu de code que vous pouvez utiliser pour reproduire:

- (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];

}

Ce code doit produire une nouvelle valeur à chaque lancement. Au lieu de cela, vous verrez que si vous quittez l'application rapidement la valeur est inchangée.

Certains peut-être liées à un débordement de pile questions:

iphone NSHTTPCookieStorage disponible sur l'app rouvrir?

iPhone: NSHTTPCookie n'est pas enregistré d'application redémarre

NSHTTPCookies refuser d'être supprimé

supprimé NSHTTPCookie retourne si l'application est terminée

25voto

Nariman Points 3484

Je pense que la réponse se trouve dans l'un de la SORTE postes liés à votre question:

J'ai fait un exemple de projet de reproduire ce problème et trouvé que c' ne pourrait se produire que lorsque l'application reçoit un signal SIGKILL, comme lors de la débogueur est arrêté à partir de l'intérieur de Xcode. Dans mes expériences, non gérée les exceptions, les accidents, exit() et abort() ne causent pas NSHTPPCookieStorage de perdre des données.

Comme cela ressemble à un débogage problème (il ne se produit que lors de l'utilisation de le débogueur), j'ai fermé le radar j'ai rempli précédemment.

Vous pouvez tester cela en redémarrant le téléphone normalement, et en observant que toutes les modifications apportées à NSHTTPCookieStorage sont correctement persisté et reloaded.

15voto

Dhariwal_Kuldeep Points 128

J'ai aussi eu le même problème mais j'ai trouvé une solution. J'ai enregistré les cookies au fur et à mesure de leur création par le navigateur, puis je les ai recréés au redémarrage de l'application.

1) Enregistrez le cookie quand ils sont créés par 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) Recréez-les maintenant au redémarrage de l'application:

 - (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

}
 

Merci

5voto

Zaky German Points 7002

Cela ressemble à un appel sous-jacent "synchroniser" de type NSUserDefaults est requis. Je pense que votre meilleur coup consiste à gérer tous les cookies de votre application séparément dans le NSUserDefaults standard et à synchroniser ceux qui manquent dans le NSHTTPCookieStorage au démarrage. Ou voyez s'il existe une méthode de synchronisation privée si vous vous sentez courageux :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X