web-dev-qa-db-fra.com

Est-il possible de définir un cookie manuellement à l'aide de sharedHTTPCookieStorage pour un UIWebView?

J'ai des vues Web dans une application iOS qui nécessitent un cookie d'authentification pour être authentifiées correctement. Je cherche un moyen de définir un cookie dans la visualisation Web d'une application iOS sans avoir à faire une demande sortante pour définir le cookie car j'ai déjà des informations d'authentification sur le client.

Ce post nous indique où les cookies UIWebView sont stockés.

À l'heure actuelle, je charge une vue Web masquée pour faire une demande sortante, mais je préférerais ne pas avoir à faire de demande externe pour configurer un simple cookie.

72
Mauvis Ledford

Oui, tu peux faire ça. Tout d'abord, dans applicationDidBecomeActive, ajoutez cette ligne

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

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

Ensuite, pour définir 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 value someValue123456 et sera envoyé avec toute demande http à www.example.com.

Pour une grande mise en garde à installer des cookies, s'il vous plaît voir ma question ici!

L'état NSHTTPCookieStorage n'est pas enregistré à la fermeture de l'application. Des connaissances/documentation définitives?

138
kball

Édition: adaptation à la question modifiée

NSHTTPCookieStorage a un -setCookies:forURL:mainDocumentURL: méthode, il est donc facile d’utiliser NSURLConnection et d’implémenter -connection:didReceiveResponse:, extraire les biscuits et les fourrer dans le bocal à biscuits:

- ( 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 objet NSDictionary de NSHTTPCookie avec properties, puis écrire le dictionnaire sur le disque. Le relire est aussi simple que d'utiliser NSDictionary '-dictionaryWithContentsOfFile: puis créer le cookie avec -initWithProperties:.)

Ensuite, vous pouvez retirer le cookie de la mémoire 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 ];
}
14
more tension

Dans Swift 3, toutes les clés sont encapsulées dans la structure HTTPCookiePropertyKey:

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

Il est nécessaire de contourner les limitations relatives aux cookies introduites par iOS 10, ce qui les rend invisibles pour différents processus.

Cela signifie que sur les appareils multi-processeurs, les vues Web sont un processus distinct de votre application, ce qui signifie que votre session "application" n'est plus automatiquement transmise à la vue Web.

Donc, dans l'essense, vous aurez besoin de le faire (même les affiches précédentes où bon, il fonctionnait automatiquement avant iOS10).

1
kindaian