Очистка файлов cookie для WKWebView на iOS 8.4
Я создаю приложение, использующее Single Sign On для входа в систему. После того, как пользователь вводит успешный идентификатор и пароль, веб-часть вещей возвращает заголовки, которые я захватываю и сохраняю в своем приложении. WKWebView также устанавливает cookie, который пользователь успешно выполнил. Это то, что я хочу избежать или отменить.
Нежелательное поведение, которое я вижу, заключается в том, что если я вхожу в систему с пользователем, все будет хорошо, а затем я выхожу из системы и снова войду в систему, WKWebView думает, что пользователь все еще входит в систему и принимает их к нежелательному URL.
В iOS 9, смягчение этого довольно просто:
let config = WKWebViewConfiguration()
config.websiteDataStore = WKWebsiteDataStore.nonPersistentDataStore()
let webView = WKWebView(frame: .zero, configuration: config)
Однако в iOS 8.4, делая все возможное, чтобы файлы cookie были очищены каждый раз, когда пользователь загружает URL-адрес Single Signing, сложнее.
Я пробовал подходы, в которых я просматриваю файлы cookie в NSHTTPCookieStorage.sharedHTTPCookieStorage()
и удаляю их. К сожалению, количество файлов cookie равно 0.
Я также попытался удалить каталог /Cookies
в NSFileManager.defaultManager()
. Это также не работает.
Одна вещь, с которой работал, заключалась в следующем. Хотя этот подход не позволял мне получать заголовки, потому что перенаправление после входа в систему должно происходить, и это мешало (в iOS 9+ и 8.4)
req = NSMutableURLRequest(URL: url)
req?.HTTPShouldHandleCookies = false
let webView = WKWebView()
webView.loadRequest(req ?? NSURLRequest(URL: url))
Я бы предпочел очистить файлы cookie в deinit
моего представления, которое содержит мой WKWebView, если это возможное решение здесь.
Ответы
Ответ 1
Это может быть длинный, но как насчет переопределения политики принятия cookie для отклонения всех файлов cookie во время входа?
NSHTTPCookieStorage.sharedHTTPCookieStorage().cookieAcceptPolicy = .Never
Другая идея заключалась бы в том, чтобы вручную манипулировать файлами cookie с помощью пользовательского подкласса WKProcessPool
(который действительно не документирован). Я считаю, что Firefox управляет любыми проблемами cookie.
Ответ 2
Даже если вы упомянули об этом, это тот подход, который вы уже пробовали в своем deinit
?
let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}