如何删除 UIWebView 的所有 cookie?
Posted
技术标签:
【中文标题】如何删除 UIWebView 的所有 cookie?【英文标题】:How to delete all cookies of UIWebView? 【发布时间】:2010-12-17 14:52:46 【问题描述】:在我的应用程序中,我有一个UIWebview
,它加载linkedin auth 页面以进行登录。当用户登录时,cookies 会保存到应用程序中。
我的应用有一个与linkedin 登录无关的注销按钮。因此,当用户单击此按钮时,他会从应用程序中注销。我希望这次注销也会从应用程序中清除他的linkedin cookie,以便用户完全注销。
【问题讨论】:
【参考方案1】:根据this question,您可以遍历“Cookie Jar”中的每个cookie并删除它们,如下所示:
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies])
[storage deleteCookie:cookie];
[[NSUserDefaults standardUserDefaults] synchronize];
【讨论】:
@Felipe 找到了一个临时方法,如果您上次注销,需要在应用加载中删除 cookie。 @Ishu 好吧,是的,这正是我现在正在做的,但它并没有真正回答关于如何真正永久删除 cookie 而不仅仅是当前会话的问题 它永久删除cookies。之后发出的任何请求都可能导致重新创建 cookie。此外,如果您只想在用户注销的情况下删除 cookie,那么我建议只删除会话 cookie,因为注销实际上只是会话的终止。否则,您将丢失用户希望跨会话保留的潜在设置。 确保调用 [[NSUserDefaults standardUserDefaults] synchronize] 以确保将更改保存到磁盘。 @felipe 这就是您在后续运行中看到 cookie 返回的原因。 我试过这个但存储返回 0 计数,我在 ios 8 模拟器上测试它。那么我该如何在 safari 上删除 facebook 的 cookie。【参考方案2】:只是想添加一些有关此的信息。
在OS X 10.9/iOS 7 及更高版本中,您可以使用-resetWithCompletionHandler: 从您的sharedSession
中清除整个应用程序的cookies 和缓存等:
清空所有 cookie、缓存和凭据存储,删除磁盘文件, 将正在进行的下载刷新到磁盘,并确保将来 请求发生在新的套接字上。
[[NSURLSession sharedSession] resetWithCompletionHandler:^
// Do something once it's done.
];
带有deleteCookie:
的for-In 循环 听起来像在枚举集合时修改。 (不知道,可能是个坏主意?)
【讨论】:
我已经使用了成功运行的两种方法,但我仍然发现谷歌在所有这些之后仍然显示搜索历史记录(未登录)。有任何想法吗?谢谢 这会影响 Alamofire 的任何状态以及我对后端 REST API 的使用吗? Alamofire 的解决方案不是基于 URLSession 吗?【参考方案3】:您可以在 WebView 的 html 中创建一个函数来清除 cookie。
如果您只需要清洁一次,您可以使用 Titanium 事件触发此功能,仅在应用启动时。
【讨论】:
【参考方案4】:如果有人正在寻找 Swift 解决方案:
let storage = HTTPCookieStorage.shared
if let cookies = storage.cookies
for cookie in cookies
storage.deleteCookie(cookie)
【讨论】:
【参考方案5】:在使用 MKWebView 的情况下,以前的答案对我没有帮助。所以,我找到了另一个解决方案:
func loadAuthUrl(_ url: URL)
let finally: VoidClosure = [weak self] in
guard let self = self else return
let request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60.0)
self.webView.load(request)
let cookieStore = webView.configuration.websiteDataStore.httpCookieStore
cookieStore.getAllCookies( [weak self] cookies in
guard let _ = self else return
let instagramCookies = cookies.filter( $0.domain == ".instagram.com" )
if instagramCookies.isEmpty
finally()
else
DispatchQueue.global().async(execute:
let group = DispatchGroup()
for cookie in cookies
group.enter()
cookieStore.delete(cookie, completionHandler: group.leave() )
group.wait()
DispatchQueue.main.async(execute: finally)
)
)
【讨论】:
以上是关于如何删除 UIWebView 的所有 cookie?的主要内容,如果未能解决你的问题,请参考以下文章