Я пытаюсь реализовать HTTP-кэширование для WKWebView, который должен вести себя следующим образом:
- Доступная сеть: извлекать веб-данные из сети и кэшировать их.
- Сеть недоступна иимеет кэшированные данные: загрузите кэшированные данные.
- Сеть недоступна и не имеет кэшированных данных: Показать представление об ошибке возврата.
Сначала я использую подобный код, как в этомОтветьте https://stackoverflow.com/a/55909771/356105, чтобы кэшировать данные и проверить, были ли данные кэшированы. я не думаю, что это необходимо для использования с WKWebView, но я не смог найти лучшего решения для проверки кэшированных данных.
Затем я использую https://github.com/ashleymills/Reachability.swift, чтобы проверить, работает ли сетьСоединение доступно вообще, прежде чем пытаться запросить загрузку веб-просмотра. Если нет сетевого подключения, но есть кэшированные данные, найденные с помощью downloadContent()
Я пытаюсь загрузить веб-представление после изменения cachePolicy:
var request = request
request.cachePolicy = .returnCacheDataDontLoad
_webView.load(request)
Если нет сети и нет кэшированных данных, яхочу показать мой запасной вариант:
private func onWebViewNavigationFailed(navigation: WKNavigation!, error: Error)
{
if !_isNetworkReachable && !_hasChachedData
{
showEmptyResultView()
}
}
Но вся эта конструкция работает ненадежно. С некоторыми веб-страницами это работает, с некоторыми нет. Когда он кэширует данные (_hasChachedData = true
) половину времени, когда веб-просмотр загружает кэшированные данные, в других случаях совсем нет ...
Поэтому мой вопрос: как правильно реализовать кэширование с WKWebView
и как я могу проверить, есть ли в WKWebView
кэшированные данные для определенного запроса? Было проделано много догадок, потому что я не могу найти в Интернете ни одного подходящего решения для этого.
Краткое изложение того, как правильно выполнить это требование, было бы очень полезно.