清除WKWebView的cookies?

9

我正在构建一个自定义身份验证视图控制器,希望在iOS 8应用程序中使用WKWebView。然而,我似乎无法弄清楚如何清除WKWebView中存储的cookie。目前是否完全不可能?

由于我无法控制服务器端,因此在成功登录时服务会发送类似于永久(或至少是长期)cookie的内容。问题是,如果用户想要更改他们的登录信息,这将变得很困难,因为即使用户注销并再次按下登录按钮,服务器仍会自动重定向,使用存储的cookie并再次登录。

欢迎提出想法和建议,谢谢!

UIWebView中清除存储的cookie很简单,您只需要执行以下操作:

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies])
{
    [storage deleteCookie:cookie];
}

但是,WKWebView似乎没有使用NSHTTPCookieStorage,因为我已经尝试在加载请求之前这样做了,但是没有成功!:(


我刚在iOS/Web技术论坛上问了同样的问题!同一个问题-想要测试,唯一的解决方法是在每次测试后清除模拟器。我去年夏天发现没有使用NSHTTPCookieStorage。不确定是否可以查看已删除的答案,有人发布了一个答案,然后删除了一个答案,他们建议使用Javascript来清除cookie。我将尝试这样做,如果成功了,我会更新这个帖子。 - David H
我尝试使用JavaScript注入来删除(过期)所有的cookie,但始终无法使其正常工作。 - David H
1
我正在使用WKWebView,你的代码对我有效。他们可能已添加了NSHTTPCookies到WKWebView。我首先将其转换为Swift,但这不应该有什么影响。 - jackreichert
3个回答

5

看起来 NSHTTPCookieStorage 在iOS 8.2中被用于正确清除cookies。我发布了一个应用程序,它会在打开基于WKWebView的登录之前运行此代码:

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies])
{
    [storage deleteCookie:cookie];
}

在 iOS 8.2 之前,该网站会使用保存的 cookie 自动登录,现在它会正确地要求用户重新登录。所有这些都是在我没有更新应用程序的情况下发生的。 :)

感谢 @jackreichert 的提醒!


5

在内部的苹果论坛上给了我答案:使用可变的NSURLRequest,并将HTTPShouldHandleCookies设置为NO:

let req: NSMutableURLRequest = NSMutableURLRequest(URL:openURL)
req.HTTPShouldHandleCookies = false
webView.loadRequest(req)

没有向网站发送cookie,所以每次都会得到登录屏幕(用于测试)。


看起来这会完全禁用cookies!当我使用request.HTTPShouldHandleCookies = NO;时,相关服务会检测到此情况,在成功登录后不会提供令牌。相反,它会给出一个错误提示,说:“无法加载此页面。如果您的浏览器禁用了cookies,或者您正在使用私人模式浏览,请尝试启用cookies或关闭私人模式,然后重试您的操作。” - Dhiraj Gupta
@DhirajGupta 如果你能弄清楚要发送什么,你也可以在请求中设置cookie字符串。 - David H

0

尽管删除cookie对于常见用例已经足够,但是在webview中存储数据的方式有很多种,例如本地数据库、会话存储、SQL数据存储等。

这个一行代码可以通过删除所有这些数据来解决问题:

WKWebsiteDataStore.default().removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), modifiedSince: Date(timeIntervalSince1970: 0), completionHandler: {})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接