我需要在重新启动应用程序时保留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
,并且我有相同的要求。我目前正在通过共享单例WKProcessPool
class ProcessPool {
static let shared = WKProcessPool()
}
但是,重新启动后,某些cookie不会保留。主要是没有exp
日期且不能在服务器上更新为具有日期的cookie。
上面的扩展使用的是HTTPCookieStorage
,但是我需要使用WKHTTPCookieStore
来实现相同(或更优)的方式,并且不确定如何使用。
我希望做这样的事情
func storeCookies() {
let __cookies = WKHTTPCookieStore()
__cookies.getAllCookies { cookies in
....
}
}
但是我不相信可以通过这种方式调用WKHTTPCookieStore
。
我也非常了解有关敏感数据的问题,例如UserDefaults
中的cookie,这不是生产应用程序,而且很久以后,该功能将被删除并用适当的安全解决方案代替。遗憾的是,这是我们目前产品所处的位置。
答案 0 :(得分:0)
您需要首先访问WKWebsiteDataStore
,这将使您可以访问cookie存储。
func storeCookies() {
let __cookies = WKWebsiteDataStore.default()
__cookies.httpCookieStore.getAllCookies { cookies in
print(cookies)
}
}