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?
如果您想删除所有 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 以后。
更新:之前我在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)
| 归档时间: |
|
| 查看次数: |
4141 次 |
| 最近记录: |