ios - 如何从 WKHttpCookieStore 中删除 cookie?

标签 ios xamarin xamarin.ios wkwebview ios11

iOS 11 为 WKWebView 带来了一些更新,包括 cookies 管理。我已经开始从 UIWebView 迁移我的应用程序并遇到了一个问题:即使 WKHttpCookieStore 提供了一种删除 cookie 的方法(deleteCookie:completionHandler:,Xamarin 包装器: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/")));

例如,这个 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?

最佳答案

如果您想删除所有 cookie,那么在 WKWebsiteDataStore 上执行此操作会更容易。在 Objective-C 中:

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

请注意,这适用于 iOS 9 及更高版本。

关于ios - 如何从 WKHttpCookieStore 中删除 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46465070/

相关文章:

xamarin - 如何从 iOS 自定义渲染器调用基本帧渲染器中的方法?

iphone - 将 HTTPS 与 Monotouch 和 WCF 结合使用

ios - 获取 FinishTransaction() 的 SKPaymentTransaction

ios - 从 plist 加载数据到 UITableView 时模拟器崩溃

ios - ViewController 的释放

c# - Android 上的 Xamarin.Forms "App has stopped working"

android - Xamarin 清除 Android 日志

ios - 在IOS中的两个NavigationViewController之间添加Wizard风格的ViewController

ios - 使用嵌入式 View Controller 调整 UIScrollView 的 contentSize

ios - SkScene 更新方法被推送通知中断,如何检测中断