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

J'ai des webviews à l'intérieur d'une application iOS qui nécessitent un cookie d'authentification pour être correctement authentifié. Je suis à la search d'un moyen de définir un cookie à l'intérieur de la vue Web d'une application iOS sans avoir à faire une request sortante pour définir le cookie car j'ai déjà des informations d'authentification sur le client.

Ce message nous montre où les cookies UIWebView sont stockés.

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

Oui, vous pouvez le faire. Tout 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 d'avoir la stratégie 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 porte le nom testCookie et la valeur someValue123456 et sera envoyé avec n'importe quelle requête http à http://www.example.com.

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

L'état NSHTTPCookieStorage n'est pas enregistré à la sortie de l'application. Une connaissance / documentation définitive existe-t-elle?

Edit: adaptation pour une question éditée

NSHTTPCookieStorage a une -setCookies:forURL:mainDocumentURL: donc la chose facile à faire est d'utiliser NSURLConnection et d'implémenter -connection:didReceiveResponse: extrayant les cookies et en les introduisant dans le cookie jar:

 - ( 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 également extraire un object NSDictionary de NSHTTPCookie avec les properties , puis écrire le dictionary sur le disque.

Ensuite, vous pouvez retirer le cookie du stockage 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 resortingeve 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 ]; } 

Dans Swift 3, toutes les keys sont enveloppé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) } 

Il est nécessaire de contourner les limitations sur les cookies introduites par iOS 10, ce qui les rend invisibles à différents process.

Cela signifie que sur les appareils dotés d'une fonction de multitraitement, les vues Web sont un process distinct de votre application, ce qui signifie que votre session "application" n'est plus transmise automatiquement à la vue Web.

Donc, en substance, vous aurez besoin de le faire (même si les affiches précédentes étaient correctes, cela fonctionnait automatiquement avant iOS10).