5 votes

Comment supprimer les cookies de WKHttpCookieStore ?

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

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 en cours de suppression :

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 ne l'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 car un code similaire fonctionne très bien avec NSHttpCookieStorage + UIWebView .

Est-ce un comportement attendu ? Si oui, pourquoi ? Existe-t-il un moyen de nettoyer les cookies dans WKHttpCookieStore ?

7voto

fishinear Points 2452

Si vous souhaitez supprimer tous les cookies, il est plus facile de le faire sur le site Web de l'entreprise. WKWebsiteDataStore . In Objective-C :

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

Notez que cela fonctionne à partir d'iOS 9.

1voto

SushiHangover Points 47109

Ne supprimez pas dans l'énumérateur, vous n'obtiendrez aucune erreur, MAIS les cookies qui sont supprimés sont vraiment aléatoires, certains basés sur la session, d'autres transitoires ne seront pas supprimés.

Je n'ai pas cherché dans l'iOS radrs mais il faudrait en ouvrir un s'il n'y en a pas, car il s'agit d'un problème lié à iOS 11 (et non à Xamarin), car "la plupart" des énumérations du Framework iOS renvoient une copie mutable que vous pouvez supprimer. Sinon, le DeleteCookie(Async) devrait retourner un NSError ...

Ma routine de Cookie Monster :

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

0voto

lassana Points 1551

Mise à jour : Auparavant, j'ai rempli un rapport de bogue à bugreport.apple.com et maintenant je peux confirmer que cela est corrigé dans iOS 12.


J'ai sauté sur la conclusion que c'est un bug d'iOS. Donc, au lieu de suppression de cookies maintenant je suis remplacement de avec des cookies ayant 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);

0voto

Peter Lapisu Points 3274

Avez-vous essayé d'utiliser NSHTTPCookieStorage à la place ? Ils devraient être liés, donc changer le NSHTTPCookieStorage devrait être reflété dans le WKCookieStorage.

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