如何从 WKHttpCookieStore 中删除 cookie?

Mik*_*nin 5 xamarin.ios ios xamarin wkwebview ios11

iOS 11 为 WKWebView 带来了一些更新,包括 cookie 管理。我已经开始从 UIWebView 迁移我的应用程序并遇到了一个问题:尽管 WKHttpCookieStore 提供了一种删除 cookie 的方法(deleteCookie:completionHandler:,Xamarin wrapper: DeleteCookieAsync),但实际上它并没有删除所有 cookie。这是我的代码:

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/")));
Run Code Online (Sandbox Code Playgroud)

例如,这个 cookie 正在被删除:

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
Run Code Online (Sandbox Code Playgroud)

但这个不是:

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
Run Code Online (Sandbox Code Playgroud)

与本机 Swift 应用程序相同的问题。我很困惑,因为类似的代码在NSHttpCookieStorage+ 上工作得很好UIWebView

这是预期的行为吗?如果是这样,为什么?有没有办法清理饼干WKHttpCookieStore

fis*_*ear 6

如果您想删除所有 cookie,那么在WKWebsiteDataStore. 在 Objective-C 中:

NSSet *websiteDataTypes = [NSSet setWithArray:@[WKWebsiteDataTypeCookies]];
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes 
                                           modifiedSince:dateFrom 
                                       completionHandler:nil];
Run Code Online (Sandbox Code Playgroud)

请注意,这适用于 iOS 9 以后。


Mik*_*nin 0

更新:之前我在bugreport.apple.com填写了错误报告,现在我可以确认这个问题已在 iOS 12 中修复。


我立刻得出结论,这是一个 iOS 错误。因此,现在我不再删除cookie,而是将其替换为具有空值的 cookie:

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);
Run Code Online (Sandbox Code Playgroud)