如何使用 WKWebView / WKHTTPCookieStore 在应用程序重新启动时保留 cookie
How can I persists cookies across app restarts with WKWebView / WKHTTPCookieStore
我需要在应用程序重新启动时保留我的 cookie。
最初在使用 UIWebView
时,我能够通过 UserDefaults
上的扩展来实现这一点
import Foundation
extension UserDefaults {
typealias CookieProperties = [HTTPCookiePropertyKey: Any]
private static let cookieKey = "app_cookie_jar"
func storeCookies() {
guard let cookies = HTTPCookieStorage.shared.cookies else { return }
let cookiePropertiesArray = cookies.compactMap { [=10=].properties }
set(cookiePropertiesArray, forKey: UserDefaults.cookieKey)
synchronize()
}
func fetchCookies() {
let cookiePropertiesArray = value(forKey: UserDefaults.cookieKey) as? [CookieProperties]
cookiePropertiesArray?.forEach {
if let cookie = HTTPCookie(properties: [=10=]) {
HTTPCookieStorage.shared.setCookie(cookie)
}
}
}
}
然后我会在各种生命周期方法中调用它
func applicationWillEnterForeground() {
defaults.fetchCookies()
...
}
func applicationDidEnterBackground() {
defaults.storeCookies()
...
}
但是现在我的应用程序正在使用 WKWebView
并且我有相同的要求。我目前通过共享单例 WKProcessPool
在我的应用程序中的不同网络视图之间共享 cookie 存储
class ProcessPool {
static let shared = WKProcessPool()
}
但是在重新启动时,一些 cookie 不会保留。主要是没有 exp
日期且无法在服务器上更新为具有日期的 cookie。
上面的扩展正在使用 HTTPCookieStorage
,但是我需要使用 WKHTTPCookieStore
实现相同的方式(或更好),但我不确定如何实现。
我希望做这样的事情
func storeCookies() {
let __cookies = WKHTTPCookieStore()
__cookies.getAllCookies { cookies in
....
}
}
但我不相信WKHTTPCookieStore
可以这样调用。
我也非常清楚 UserDefaults
中有关 cookie 等敏感数据的问题,这不是生产应用程序,并且在发布之前很久就会删除此功能,并用适当、安全的解决方案取而代之。遗憾的是,这正是我们此时使用产品的地方。
您需要先访问 WKWebsiteDataStore
,这将使您能够访问 cookie 存储。
func storeCookies() {
let __cookies = WKWebsiteDataStore.default()
__cookies.httpCookieStore.getAllCookies { cookies in
print(cookies)
}
}
我需要在应用程序重新启动时保留我的 cookie。
最初在使用 UIWebView
时,我能够通过 UserDefaults
import Foundation
extension UserDefaults {
typealias CookieProperties = [HTTPCookiePropertyKey: Any]
private static let cookieKey = "app_cookie_jar"
func storeCookies() {
guard let cookies = HTTPCookieStorage.shared.cookies else { return }
let cookiePropertiesArray = cookies.compactMap { [=10=].properties }
set(cookiePropertiesArray, forKey: UserDefaults.cookieKey)
synchronize()
}
func fetchCookies() {
let cookiePropertiesArray = value(forKey: UserDefaults.cookieKey) as? [CookieProperties]
cookiePropertiesArray?.forEach {
if let cookie = HTTPCookie(properties: [=10=]) {
HTTPCookieStorage.shared.setCookie(cookie)
}
}
}
}
然后我会在各种生命周期方法中调用它
func applicationWillEnterForeground() {
defaults.fetchCookies()
...
}
func applicationDidEnterBackground() {
defaults.storeCookies()
...
}
但是现在我的应用程序正在使用 WKWebView
并且我有相同的要求。我目前通过共享单例 WKProcessPool
class ProcessPool {
static let shared = WKProcessPool()
}
但是在重新启动时,一些 cookie 不会保留。主要是没有 exp
日期且无法在服务器上更新为具有日期的 cookie。
上面的扩展正在使用 HTTPCookieStorage
,但是我需要使用 WKHTTPCookieStore
实现相同的方式(或更好),但我不确定如何实现。
我希望做这样的事情
func storeCookies() {
let __cookies = WKHTTPCookieStore()
__cookies.getAllCookies { cookies in
....
}
}
但我不相信WKHTTPCookieStore
可以这样调用。
我也非常清楚 UserDefaults
中有关 cookie 等敏感数据的问题,这不是生产应用程序,并且在发布之前很久就会删除此功能,并用适当、安全的解决方案取而代之。遗憾的是,这正是我们此时使用产品的地方。
您需要先访问 WKWebsiteDataStore
,这将使您能够访问 cookie 存储。
func storeCookies() {
let __cookies = WKWebsiteDataStore.default()
__cookies.httpCookieStore.getAllCookies { cookies in
print(cookies)
}
}