2017-09-28 3 views
2

iOS 11 apporte quelques mises à jour pour WKWebView, y compris la gestion des cookies. J'ai commencé à migrer mon application de UIWebView et a couru dans un problème: même si WKHttpCookieStore fournit une méthode pour supprimer les cookies (deleteCookie:completionHandler:, emballage Xamarin: DeleteCookieAsync), en fait il ne supprime pas tous les cookies. Voici mon code:Comment supprimer les cookies de WKHttpCookieStore?

WKHttpCookieStore cookieStore = WKWebsiteDataStore.DefaultDataStore.HttpCookieStore; 

// Delete all cookies 
NSHttpCookie[] allCookies = await cookieStore.GetAllCookiesAsync(); 
foreach (NSHttpCookie cookieToDelete in allCookies) 
{ 
    await cookieStore.DeleteCookieAsync(cookieToDelete); 
} 

NSHttpCookie[] newCookies = await cookieStore.GetAllCookiesAsync(); 
// why newCookies is not an empty array? 

myWkWebView.LoadRequest(new NSUrlRequest(new NSUrl("https://facebook.com/"))); 

Par exemple, ce cookie est supprimé:

NSHTTPCookie  
version:1 
name:c_user  
value:100015842... 
expiresDate:'2017-12-27 07:37:39 +0000'  
created:'2017-09-28 07:39:01 +0000'  
sessionOnly:FALSE 
domain:.facebook.com  
partition:none 
path:/ 
isSecure:TRUE 
path:"/" 
isSecure:TRUE 

Mais celui-ci n'est pas:

NSHTTPCookie  
version:1 
name:sb  
value:bKbMW......OJ1V 
expiresDate:'2019-09-28 07:37:39 +0000'  
created:'2017-09-28 07:39:15 +0000'  
sessionOnly:FALSE 
domain:.facebook.com  
partition:none 
path:/ 
isSecure:TRUE 
path:"/" 
isSecure:TRUE 

Même problème avec l'application native Swift. Je suis assez confus puisque le code similaire fonctionne très bien avec NSHttpCookieStorage + UIWebView.

Est-ce que ce comportement est attendu? Si oui, pourquoi? Y at-il un moyen de nettoyer les cookies dans WKHttpCookieStore?

Répondre

1

Éloignez-vous de la suppression dans l'énumérateur, vous n'obtiendrez pas d'erreurs, MAIS les cookies qui sont supprimés sont vraiment aléatoires, certains basés sur les sessions, certains transitoires ne seront pas supprimés.

Je n'ai pas cherché l'iOS radrs, mais il faut ouvrir s'il n'y a pas de problème iOS 11 (pas un Xamarin) car l'énumération "la plus" d'iOS Framework renvoie une copie modifiable que vous pouvez supprimer dans . Sinon, le DeleteCookie (Async) doit retourner un NSError ...

Mon Cookie Monster routine:

var cookies = await WKWebsiteDataStore.DefaultDataStore.HttpCookieStore.GetAllCookiesAsync(); 
for (int i = cookies.Length - 1; i >= 0; i--) 
{ 
    await WKWebsiteDataStore.DefaultDataStore.HttpCookieStore.DeleteCookieAsync(cookies[i]); 
} 
cookies = await WKWebsiteDataStore.DefaultDataStore.HttpCookieStore.GetAllCookiesAsync(); 
if (cookies.Length == 0) 
{ 
    Console.WriteLine("Cookie Monster ate them all"); 
} 
+0

Oui, ça ressemble à un bogue iOS. –

+0

Ne fonctionne pas pour moi. J'ai essayé beaucoup de solutions de contournement et toujours ne pas avoir la bonne solution. – CarLoOSX

0

je sautais à la conclusion que c'est un bug iOS. Ainsi, au lieu de supprimer les cookies maintenant je suis remplacer les avec les cookies avec une valeur vide:

NSDictionary properties = NSDictionary.FromObjectsAndKeys(
    objects: new NSObject[] 
    { 
     new NSString(cookieToDelete.Name ?? ""), 
     new NSString(""), 
     new NSString(cookieToDelete.Path ?? ""), 
     new NSString(cookieToDelete.Domain ?? ""), 
    }, 
    keys: new NSObject[]  
    { 
     NSHttpCookie.KeyName, 
     NSHttpCookie.KeyValue, 
     NSHttpCookie.KeyPath, 
     NSHttpCookie.KeyDomain, 
    } 
); 
NSHttpCookie cookieToReplace = NSHttpCookie.CookieFromProperties(properties); 
await cookieStore.SetCookieAsync(cookieToReplace); 
+0

Vous n'avez pas à les "remplacer", il suffit de les supprimer comme le fait mon exemple de code (juste faire ** pas ** utiliser un énumérateur foreach) – SushiHangover

+0

@SushiHangover J'ai essayé simple 'for': pas de différence, le même bugly comportement. –

0

Avez-vous essayé en utilisant NSHTTPCookieStorage insted? Ils doivent être liés, de sorte que la modification de NSHTTPCookieStorage doit être répercutée sur WKCookieStorage

+0

TBH Je n'ai pas essayé, cependant 'NSHTTPCookieStorage' et' WKWebView' ne sont pas connectés sur iOS 10 au moins. Y a-t-il des changements à partir de iOS 11? –

+0

hmm, par mon expérience dans iOS11 (n'a pas testé dans 10 encore), les cookies de WKWebView refléteront à NSHTTPCookieStorage, comme un ensemble de cookies de la page Web sera après un court délai disponible dans les cookies NSHTTPCookieStorage –

+0

Oh, mon premier commentaire est mal, ils sont connectés.Je me souviens pourquoi je ne pouvais pas utiliser NSHTTPCookieStorage dans mon application: _WKWebView synchronise probablement les cookies sur le processus de l'interface utilisateur selon son propre calendrier. Pas après chaque navigation._ https://bugs.webkit.org/show_bug.cgi?id=140191 Dans mon cas, ce retard n'était pas court et il était inacceptable dans l'application, car l'application doit réagir immédiatement lorsque l'utilisateur se connecte. –

1

Si vous souhaitez supprimer tous les cookies, il est plus facile de le faire sur le WKWebsiteDataStore. En Objective-C:

NSSet *websiteDataTypes = [NSSet setWithArray:@[WKWebsiteDataTypeCookies]]; 
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0]; 
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes 
              modifiedSince:dateFrom 
             completionHandler:nil]; 

Notez que cela fonctionne depuis iOS 9 et versions ultérieures.

+0

Merci, bon point. Cependant, la suppression des cookies d'un domaine spécifique est également importante pour moi. Je dois vérifier _deleting_ de 'HttpCookieStore' sur iOS 11.2, peut-être maintenant il est corrigé ... –