Как сохранить файлы cookie при перезапуске приложения с помощью WKWebView / WKHTTPCookieStore - PullRequest
0 голосов
/ 02 мая 2019

У меня есть требование сохранять файлы 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, и у меня такое же требование. В настоящее время я делю хранилище файлов cookie между различными веб-представлениями в моем приложении с помощью общего синглтона WKProcessPool

class ProcessPool {
    static let shared = WKProcessPool()
}

Однако при перезапуске некоторые файлы cookie не сохраняются. В основном куки, которые не имеют даты exp и не могут быть обновлены на сервере, чтобы иметь такую ​​дату.

В приведенном выше расширении используется HTTPCookieStorage, но мне нужно добиться чего-то такого же (или лучшего) использования WKHTTPCookieStore, и я не уверен, как.

Я надеялся сделать что-то подобное

func storeCookies() {

    let __cookies = WKHTTPCookieStore()

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

Но я не верю, что WKHTTPCookieStore может быть вызван таким образом.

Мне также хорошо известны проблемы, связанные с конфиденциальными данными, такими как файлы cookie, в UserDefaults, это не производственное приложение, и задолго до релиза эта функциональность будет удалена и заменена надлежащим, безопасным решением. К сожалению, это именно то, где мы находимся с продуктом в данный момент.

1 Ответ

0 голосов
/ 02 мая 2019

Сначала вам нужно получить доступ к WKWebsiteDataStore, это даст вам доступ к хранилищу cookie.

func storeCookies() {

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