Вопрос или проблема
Я использую нативный webview для Android, а сервер состоит из Apache, Tomcat и Spring. Когда я запрашиваю статические ресурсы, такие как js, css, mp3, png и т. д., нативная ошибка показывает, что это связано со статикой.
Исходный код Android. (сбор логов с помощью Rollbar, инструмента для ведения роллинговых логов).
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
QLog.d("[WebViewClient::onReceivedError()]");
QLog.d(" >> url : " + request.getUrl().toString());
QLog.d(" >> error : " + error.getErrorCode() + " / " + error.getDescription());
int errorCode = error.getErrorCode();
try {
throw new RuntimeException("onReceivedError2");
} catch (RuntimeException e) {
CustomKeysAndValues keysAndValues = new CustomKeysAndValues.Builder()
.putString("function", "onReceivedError2")
.putString("url", request.getUrl().toString())
.putString("onPageStartUrl", onPageStartUrl)
.putString("errorCode", ""+errorCode)
.putString("description", ""+error.getDescription())
.putString("history", getPageHistory())
.build();
FirebaseCrashlytics.getInstance().setCustomKeys(keysAndValues);
FirebaseCrashlytics.getInstance().recordException(e);
Rollbar rollbar = Rollbar.instance();
rollbar.error(String.format("function: %s, url: %s, onPageStartUrl: %s, errorCode: %s, description: %s, history: %s",
"onReceivedError2",
request.getUrl().toString(),
onPageStartUrl,
errorCode,
error.getDescription(),
getPageHistory()
));
}
if( mOnPageLoadListener != null ){
if( !(errorCode == -1 || errorCode == -6) ) {
if ( !(request.getUrl().toString().contains(".mp4") || request.getUrl().toString().endsWith(".png")) ) {
mOnPageLoadListener.onPageError(PageError.networkError);
}
}
}
}
функция: onReceivedError2, url: https://test2.tnmiot.co.kr:8443/images_theme/faq/21/FREEZER_ALARM.mp4, onPageStartUrl: https://test2.tnmiot.co.kr:8443/faq/VM1421, errorCode: -1, описание: net::ERR_FAILED, история: [1:https://test2.tnmiot.co.kr:8443/me
Настройки
- Android + Сервер (Apache + Tomcat + Spring)
Я уже настраивал http и манифест (например, http, аутентификация..), но это не помогло.
Ответ или решение
Проблема, с которой вы столкнулись, связана с ошибками при загрузке статических ресурсов (таких как JavaScript, CSS, MP4 и т.д.) в WebView на Android. Рассмотрим несколько шагов и рекомендаций, которые могут помочь решить эту проблему.
1. Проверьте настройки CORS и HTTP(S)
Убедитесь, что сервер настроен для поддержки CORS (Cross-Origin Resource Sharing). В вашем случае, так как вы используете Apache и Tomcat, настройте заголовки CORS в конфигурации вашего сервера для разрешения кросс-доменных запросов:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
Этот заголовок позволит вашему приложению загружать ресурсы с других источников. Учтите, что *
разрешает доступ из любого источника, что может быть небезопасно для некоторых приложений. Отредактируйте его, чтобы указать конкретные домены, если это необходимо.
2. Обновите настройки WebView
Убедитесь, что ваш WebView настроен правильно. Проверьте, чтобы настройки включали поддержку JavaScript и настроенные кэширование (например, если ресурсы загружаются однократно):
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
3. Разрешите доступ к интернету
Убедитесь, что в вашем AndroidManifest.xml
файле указано разрешение на доступ в интернет:
<uses-permission android:name="android.permission.INTERNET"/>
4. Проверьте сертификаты HTTPS
Если ваш сервер использует HTTPS, убедитесь, что сертификаты корректны и что ваш WebView может их распознать. На некоторых устройствах могут возникнуть проблемы с сертификатами самоподписанного типа.
5. Логирование ошибок
Вы уже используете Rollbar для логирования ошибок, что отлично. Дополнительно вы можете улучшить отладку, добавив дополнительную информацию о запросе в методе onReceivedError()
. Например, проверьте статус ответа от сервера, чтобы понять, что именно не так:
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
Log.d("WebViewClient", "URL: " + request.getUrl());
Log.d("WebViewClient", "Error Code: " + error.getErrorCode());
Log.d("WebViewClient", "Description: " + error.getDescription());
// Ваш логика обработки ошибок
}
6. Использование функции shouldOverrideUrlLoading
Убедитесь, что у вас нет условий в методе shouldOverrideUrlLoading
, которые могут предотвратить загрузку ваших статических ресурсов:
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return false; // Дайте WebView обрабатывать загрузку URL
}
Заключение
Оптимизация загрузки статических ресурсов в WebView на Android требует комплексного подхода, включая правильную настройку сервера, конфигурацию WebView и отладку. Проверьте все вышеперечисленные аспекты и при необходимости добавьте дополнительную обработку ошибок для лучшего понимания проблемы. Если ошибки продолжаются, рассмотрите возможность использования CURL или Postman для тестирования URL-адресов с вашего сервера отдельно от приложения.
Дайте знать, если у вас возникнут дополнительные вопросы или потребуется конкретная помощь с конфигурацией!