0

我需要在应用程序重新启动时保留我的 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,这不是一个生产应用程序,并且在发布之前很久就会删除此功能并替换为适当、安全的解决方案。遗憾的是,这正是我们目前使用产品的地方。

4

1 回答 1

0

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

func storeCookies() {

    let __cookies = WKWebsiteDataStore.default()
    __cookies.httpCookieStore.getAllCookies { cookies in
        print(cookies)
    }
}
于 2019-05-02T05:47:23.503 回答