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