72 votes

Est-il possible de définir manuellement un cookie en utilisant sharedHTTPCookieStorage pour une UIWebView ?

J'ai des webviews dans une application iOS qui nécessitent un cookie d'authentification pour être correctement authentifiés. Je cherche un moyen de définir un cookie à l'intérieur d'une vue web d'une application iOS sans avoir à faire une demande sortante pour définir le cookie puisque j'ai déjà les informations d'authentification sur le client.

Ce site poste nous montre où sont stockés les cookies de UIWebView.

Pour l'instant, je charge une vue Web cachée pour faire une demande sortante, mais je préférerais ne pas avoir à faire une demande externe pour définir un simple cookie.

139voto

kball Points 2499

Oui, vous pouvez le faire. D'abord, dans applicationDidBecomeActive, ajoutez cette ligne

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

Le cookieAcceptPolicy est partagé entre les applications et peut être modifié à votre insu. Vous devez donc être sûr de disposer de la politique d'acceptation dont vous avez besoin chaque fois que votre application est en cours d'exécution.

Ensuite, pour mettre le 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];

Ce cookie a pour nom testCookie et pour valeur someValue123456 et sera envoyé avec toute demande http à www.example.com.

Pour une mise en garde importante concernant la configuration des cookies, veuillez consulter ma question ici !

L'état du NSHTTPCookieStorage n'est pas sauvegardé à la sortie de l'application. Existe-t-il une documentation ou des connaissances définitives à ce sujet ?

14voto

more tension Points 2642

Edit : adaptation pour la question éditée

NSHTTPCookieStorage a un -setCookies:forURL:mainDocumentURL: donc la chose la plus simple à faire est d'utiliser la méthode NSURLConnection et mettre en œuvre -connection:didReceiveResponse: en extrayant les cookies et en les mettant dans la boîte à 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 ];
}

(Vous pouvez aussi simplement extraire un NSDictionary de l'objet NSHTTPCookie con properties puis écrire le dictionnaire sur le disque. Pour le relire, il suffit d'utiliser NSDictionary 's -dictionaryWithContentsOfFile: et ensuite créer le cookie avec -initWithProperties: .)

Vous pouvez ensuite retirer le biscuit de son emplacement lorsque vous en avez besoin :

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

8voto

JAL Points 3432

En Swift 3, toutes les clés sont enveloppées dans la balise HTTPCookiePropertyKey struct :

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)
}

1voto

kindaian Points 125

Il est nécessaire de contourner les limitations des cookies introduites par iOS 10, qui les rendent invisibles pour les différents processus.

Cela signifie que sur les appareils dotés d'une capacité de multiprocessing, les webviews constituent un processus distinct de votre application, ce qui signifie que votre session "app" n'est plus transmise automatiquement à la webview.

Donc, en substance, vous devrez le faire (même si les posters précédents avaient raison, cela fonctionnait automatiquement avant iOS10).

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