iOS — WKWebView — Кэширование предыдущего состояния приложения во время последующих запусков приложения

#ios #swift #caching #browser #wkwebview

Вопрос:

У нас есть приложение iOS, которое использует WKWebView для загрузки веб-приложения на Apple iPod. Он поддерживает функцию автоматического входа в систему без необходимости ввода пользователем учетных данных вручную. Мы используем логику отправки html-формы POST с учетными данными для имитации автоматического входа в систему.

Веб-приложение имеет тайм-аут в течение 15 минут, после чего пользователи будут выходить из системы и перенаправляться на экран входа в систему, а на экране входа будет отображаться сообщение «Тайм-аут».

Проблема, которую мы наблюдаем, заключается в том, что всякий раз, когда пользователь запускает приложение заново (которое в данный момент не работает ни в фоновом режиме, ни на переднем плане), ожидается, что отправленная форма будет загружена в виде HTML в веб-представлении, и либо пользователь войдет в систему (если учетные данные верны) (или) пользователь будет перенаправлен на экран входа (с сообщением о недопустимых учетных данных).

webview.loadHTMLString(html, базовый код: myURL)

Но в этом случае пользователь перенаправляется на экран входа в систему с сообщением «Тайм-аут» (это предыдущее состояние приложения). Пользователь попытался убить приложение (дважды нажмите кнопку «Домой» и проведите пальцем вверх) и повторно запустить приложение, и после 2-3 попыток он успешно проходит аутентификацию и переходит на главный экран. Для всех первых 2-3 попыток он видит сообщение «Тайм-аут», которое не ожидается.

Кэширование страницы WKWebView по какой-то причине (или) приложение iOS делает что-то не так? Любые предложения о том, как это отладить, будут высоко оценены.

Примечание: Наш бизнес не хочет очищать кэш, так как каждый раз для загрузки без кэша требуется ~20 секунд. Следовательно, мы кэшируем приложение.

Ответ №1:

Вы всегда можете просто протестировать очистку всех WebView данных и посмотреть, поможет ли это. Попробуйте использовать приведенный ниже код в deinit{} том ViewController или ином месте, где вы убираете после закрытия приложения, если оно закрыто.

Приведенный ниже код удалит все данные, связанные с произошедшим веб-сеансом.

 for cookie in HTTPCookieStorage.shared.cookies ?? [] {  HTTPCookieStorage.shared.deleteCookie(cookie)  }  URLCache.shared.removeAllCachedResponses()  WKWebsiteDataStore.default().removeData(  ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(),  modifiedSince: Date(timeIntervalSince1970: 0),  completionHandler:{})  

Комментарии:

1. Привет, Мишка, спасибо за твой ответ. Это то, что мы хотим опробовать и проверить, чтобы понять, является ли это основной причиной или нет. Но наш бизнес не в восторге от очистки кэша в качестве постоянного решения, так как это занимает много времени во время каждого запуска приложения.