如何从 WKHttpCookieStore 中删除 cookie?

How to delete cookies from WKHttpCookieStore?

iOS 11 为 WKWebView 带来了一些更新,包括 cookies 管理。我已经开始将我的应用程序从 UIWebView 和 运行 迁移到一个问题中:尽管 WKHttpCookieStore 提供了删除 cookie 的方法 (deleteCookie:completionHandler:, Xamarin wrapper: DeleteCookieAsync),但实际上 它并没有't 删除所有 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/")));

例如,正在删除此 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

但这一个不是:

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

本机 Swift 应用存在同样的问题。我很困惑,因为类似的代码适用于 NSHttpCookieStorage + UIWebView.

这是预期的行为吗?如果是这样,为什么?有没有办法清除 WKHttpCookieStore 中的 cookie?

避免在枚举器内删除,你不会得到任何错误,但删除的cookies是真的随机的,一些基于会话的,一些基于瞬时的将不会被删除。

我没有搜索 iOS radrs,但如果没有,应该打开一个,因为这是 iOS 11 期(不是 Xamarin 期),因为 "most" iOS 框架枚举 return 您可以在其中删除的可变副本。否则 DeleteCookie(Async) 应该 return 一个 NSError...

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

更新:之前我在 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);

您是否尝试使用 NSHTTPCookieStorage insted?它们应该是链接的,所以更改 NSHTTPCookieStorage 应该反映到 WKCookieStorage

如果您想删除所有 cookie,那么在 WKWebsiteDataStore 上更容易做到。在 Objective-C:

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

请注意,这从 iOS 9 开始有效。