2017-09-28 1 views
2

iOS 11 bringt einige Updates für WKWebView, einschließlich der Verwaltung von Cookies. Ich habe angefangen, meine App von UIWebView Migration und lief in ein Problem: obwohl WKHttpCookieStore stellt ein Verfahren zum Löschen von Cookies (deleteCookie:completionHandler:, Xamarin Wrapper: DeleteCookieAsync), in der Tat es nicht alle Cookies nicht löschen. Hier ist mein Code:Wie lösche ich Cookies von 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/"))); 

Zum Beispiel dieses Cookie gelöscht wird:

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 

Aber dies ist nicht:

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 

gleiches Problem mit nativen Swift App. Ich bin ziemlich verwirrt, da ein ähnlicher Code mit NSHttpCookieStorage + UIWebView einwandfrei funktioniert.

Ist das erwartete Verhalten? Wenn ja warum? Gibt es eine Möglichkeit, Cookies in WKHttpCookieStore zu reinigen?

Antwort

1

Bleiben Sie weg vom Löschen innerhalb des Enumerators, Sie werden keine Fehler bekommen, ABER die Cookies, die gelöscht werden, sind wirklich zufällig, einige sitzungsbasiert, einige transient-basierte werden nicht gelöscht.

Ich habe nicht die iOS radrs gesucht, aber man sollte geöffnet werden, wenn es nicht ist, da dies ein iOS 11 Problem ist (nicht ein Xamarin) als "die meisten" iOS Framework-Enumeration eine veränderbare Kopie zurückgeben, die Sie löschen können . Ansonsten sollte die DeleteCookie (Async) geben eine NSError ...

My 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

Ja, es sieht aus wie ein iOS-Bug. –

+0

Funktioniert nicht für mich. Ich habe viele Workarounds ausprobiert und immer noch nicht die richtige Lösung. – CarLoOSX

0

ich zu dem Schluss, dass es sprang ein iOS Fehler ist. Anstatt also Löschen Cookies jetzt bin ich ersetzen sie mit Cookies mit einem leeren Wert:

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

Sie müssen sie nicht "ersetzen", löschen Sie sie einfach wie in meinem Codebeispiel (verwenden Sie ** nicht ** einen Foreach-Enumerator) – SushiHangover

+0

@SushiHangover Ich habe es einfach 'for' probiert: kein Unterschied, der gleiche Fehler Verhalten. –

0

haben Sie versucht NSHTTPCookieStorage mit insted? Sie sollten verknüpft werden, so sollte die Änderung der NSHTTPCookieStorage zu WKCookieStorage

+0

TBH Ich habe es nicht versucht, aber 'NSHTTPCookieStorage' und' WKWebView' sind nicht mindestens mit iOS 10 verbunden. Gibt es einige Änderungen, die iOS 11 starten? –

+0

hmm, nach meiner Erfahrung in iOS11 (noch nicht in 10 getestet), werden Cookies von WKWebView zu NSHTTPCookieStorage widerspiegeln, da ein Cookie von der Webseite nach einer kurzen Verzögerung in NSHTTPCookieStorage Cookies –

+0

Oh, mein erster Kommentar ist falsch, sie sind verbunden.Ich erinnere mich, warum ich "NSHTTPCookieStorage" in meiner App nicht verwenden konnte: _WKWebView synchronisiert wahrscheinlich Cookies nach eigenem Zeitplan mit dem UI-Prozess. Nicht nach jeder navigation._ https://bugs.webkit.org/show_bug.cgi?id=140191 In meinem Fall war diese Verzögerung nicht kurz und es war inakzeptabel in der App, da die App sofort reagieren muss, wenn sich der Benutzer anmeldet. –

1

widerspiegeln Wenn Sie alle Cookies löschen möchten, dann ist es einfacher, das auf der WKWebsiteDataStore zu tun. In Objective-C:

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

Beachten Sie, dass dies ab iOS 9 funktioniert.

+0

Danke, guter Punkt. Aber auch das Löschen von Cookies einer bestimmten Domain ist mir wichtig. Ich muss _deleting_ von 'HttpCookieStore' auf iOS 11.2 überprüfen, vielleicht ist es jetzt behoben ... –