我需要在应用程序重新启动时保留我的 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 { $0.properties }
set(cookiePropertiesArray, forKey: UserDefaults.cookieKey)
synchronize()
}
func fetchCookies() {
let cookiePropertiesArray = value(forKey: UserDefaults.cookieKey) as? [CookieProperties]
cookiePropertiesArray?.forEach {
if let cookie = HTTPCookie(properties: $0) {
HTTPCookieStorage.shared.setCookie(cookie)
}
}
}
}
然后我会在各种生命周期方法中调用它
func applicationWillEnterForeground() {
defaults.fetchCookies()
...
}
func applicationDidEnterBackground() {
defaults.storeCookies()
...
}
但是现在我的应用程序正在使用WKWebView
并且我有相同的要求。我目前通过共享单例在我的应用程序中的不同 Web 视图之间共享 cookie 存储WKProcessPool
class ProcessPool {
static let shared = WKProcessPool()
}
但是,在重新启动时,某些 cookie 不会保留。主要是没有exp
日期且无法在服务器上更新以拥有日期的 cookie。
上面的扩展正在使用,HTTPCookieStorage
但是我需要使用相同的方式(或更好的方式)来实现某些东西,但我WKHTTPCookieStore
不确定如何使用。
我希望做这样的事情
func storeCookies() {
let __cookies = WKHTTPCookieStore()
__cookies.getAllCookies { cookies in
....
}
}
但我不相信WKHTTPCookieStore
可以以这种方式调用。
我也非常了解 cookie 等敏感数据的问题UserDefaults
,这不是一个生产应用程序,并且在发布之前很久就会删除此功能并替换为适当、安全的解决方案。遗憾的是,这正是我们目前使用产品的地方。