如何从 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 开始有效。
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 开始有效。