在我的应用程序中,我有一个 UIWebview
,它加载领英的身份验证页面以进行登录。当用户登录时,cookie 保存在应用程序中。
我的应用程序有一个注销按钮,与领英登录无关。因此,当用户点击该按钮时,他将从应用程序中注销。我希望这个注销动作也能清除他在应用程序中的领英 cookie,使用户完全注销。
在我的应用程序中,我有一个 UIWebview
,它加载领英的身份验证页面以进行登录。当用户登录时,cookie 保存在应用程序中。
我的应用程序有一个注销按钮,与领英登录无关。因此,当用户点击该按钮时,他将从应用程序中注销。我希望这个注销动作也能清除他在应用程序中的领英 cookie,使用户完全注销。
根据这篇问题的回答,你可以遍历“Cookie Jar”中的每个cookie并将它们删除,如下所示:
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies]) {
[storage deleteCookie:cookie];
}
[[NSUserDefaults standardUserDefaults] synchronize];
我想补充一些关于此事的信息。
在OS X 10.9/iOS 7及以后版本中,您可以使用-resetWithCompletionHandler:来清除整个应用程序的cookies、缓存等内容,从您的sharedSession
中:
清空所有的cookies、缓存和凭证存储,删除磁盘文件,将正在进行的下载刷新到磁盘上,并确保未来的请求发生在新的套接字上。
[[NSURLSession sharedSession] resetWithCompletionHandler:^{
// Do something once it's done.
}];
deleteCookie:
的 for-In 循环 对我来说听起来像是在遍历集合时进行修改(不知道,可能是个坏主意?)之前的答案在使用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)
})
}
})
}
如果有人正在寻找Swift解决方案:
let storage = HTTPCookieStorage.shared
if let cookies = storage.cookies{
for cookie in cookies {
storage.deleteCookie(cookie)
}
}