在iOS 8.4上清除WKWebView的Cookies

11

我正在开发一个应用程序,使用单点登录让用户登录。当用户输入成功的ID和密码后,网页端会返回头信息,我会抓取并在我的应用程序中存储。WKWebView还会设置一个cookie来表示用户已成功登录。这正是我想避免或撤消的。

我看到的不良行为是,如果我让一个用户登录,一切都很顺利,然后我将其注销,再次登录时,WKWebView仍然认为用户已登录,并将其带到不需要的URL。

在iOS 9中,解决这个问题相当简单:

let config = WKWebViewConfiguration()
config.websiteDataStore = WKWebsiteDataStore.nonPersistentDataStore()

let webView = WKWebView(frame: .zero, configuration: config)
然而在iOS 8.4中,确保每次用户进入加载单点登录网址时清除Cookie更加复杂。我尝试过遍历NSHTTPCookieStorage.sharedHTTPCookieStorage()中的Cookie并将它们移除的方法,但是Cookie计数为0。我也尝试过删除NSFileManager.defaultManager()中的/Cookies目录,但这也没有起作用。一种有点可行的方法是执行以下操作。虽然这种方法不允许我获取标头,因为需要登录后重定向会干扰(在iOS 9+和8.4中)。
req = NSMutableURLRequest(URL: url)
req?.HTTPShouldHandleCookies = false
let webView = WKWebView()
webView.loadRequest(req ?? NSURLRequest(URL: url))

如果可能的话,我更喜欢在持有WKWebView的视图的deinit中清除cookie作为解决方案。


请检查我在下面类似问题的答案: http://stackoverflow.com/questions/38480867/how-to-delete-wkwebview-s-cache-in-ios8/38806014#38806014 - Roman Ermolov
2个回答

0

即使你提到了它,这是你在deinit中已经尝试过的方法吗?

let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
        for cookie in storage.cookies! {
            storage.deleteCookie(cookie)
        }

我确实尝试过那种方法。 - Zack Shapiro

0
这可能是一个冒险的想法,但是在登录时覆盖 cookie 接受策略以拒绝所有 cookie 怎么样?
NSHTTPCookieStorage.sharedHTTPCookieStorage().cookieAcceptPolicy = .Never

另一个想法是使用自定义的WKProcessPool子类手动管理cookie(这并没有真正记录在案)。我相信这就是Firefox处理任何cookie问题的方式。

@ZackShapiro 抱歉,我会继续思考可能的解决方案。 - JAL
谢谢JAL,我很感激。困难的部分是,req = NSMutableURLRequest(URL: url); req?.HTTPShouldHandleCookies = false方法在清除cookie方面起作用,但当重定向发生时,在返回头和设置cookie时,所有这些都被该方法阻止了。如果我能让进程继续并在下一个进程开始之前清除cookie,那就太好了。 - Zack Shapiro

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