如何使用WKWebView / WKHTTPCookieStore

时间:2019-05-02 05:39:50

标签: swift cookies 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 { $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

在我的应用程序的不同Web视图之间共享Cookie存储。
class ProcessPool {
    static let shared = WKProcessPool()
}

但是,重新启动后,某些cookie不会保留。主要是没有exp日期且不能在服务器上更新为具有日期的cookie。

上面的扩展使用的是HTTPCookieStorage,但是我需要使用WKHTTPCookieStore来实现相同(或更优)的方式,并且不确定如何使用。

我希望做这样的事情

func storeCookies() {

    let __cookies = WKHTTPCookieStore()

    __cookies.getAllCookies { cookies in
        ....
    }
}

但是我不相信可以通过这种方式调用WKHTTPCookieStore

我也非常了解有关敏感数据的问题,例如UserDefaults中的cookie,这不是生产应用程序,而且很久以后,该功能将被删除并用适当的安全解决方案代替。遗憾的是,这是我们目前产品所处的位置。

1 个答案:

答案 0 :(得分:0)

您需要首先访问WKWebsiteDataStore,这将使您可以访问cookie存储。

func storeCookies() {

    let __cookies = WKWebsiteDataStore.default()
    __cookies.httpCookieStore.getAllCookies { cookies in
        print(cookies)
    }
}