如何删除 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?的主要内容,如果未能解决你的问题,请参考以下文章

更改 UIWebView 上的 cookie 策略

iOS UIWebView 允许所有三方cookie

如何在 UIWebView 中禁用 cookie?

如何清除/禁用 UIWebView 的浏览历史记录

iOS开发WKWebView Cookie的读取与写入,与UIWebView的Cookie共享

UIWebview 启用cookies