如何使用 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)
    }
}