Работал ли с WebView

Ответ

Да, работал. WebView позволяет отображать веб-контент внутри приложения. Основные моменты:

  • Базовая настройка:
val webView = findViewById<WebView>(R.id.webView)
webView.settings.javaScriptEnabled = true
webView.loadUrl("https://example.com")
  • Обработка навигации (чтобы ссылки открывались внутри WebView):
webView.webViewClient = WebViewClient()
  • Обработка JS-интерфейсов (взаимодействие между JS и Kotlin/Java):
webView.addJavascriptInterface(MyJsInterface(), "Android")

Важно:

  • Проверять shouldOverrideUrlLoading для безопасности.
  • Очищать кэш и историю в onDestroy().
  • Для сложных сценариев можно использовать Chrome Custom Tabs.

Проблемы:

  • Утечки памяти (нужно отделять WebView от Activity).
  • Ограничения API (например, на Android 9+ cleartextTraffic требует явного разрешения).

Ответ 18+ 🔞

А, WebView! Ну это ж классика, ёпта. Как будто на дворе 2002-й год, а мы всё ещё в приложение сайты пихаем. Но работает, чёрт возьми, работает!

Смотри, если по-простому, то это как встроенный браузер, только кривой и вечно чем-то недовольный. Берёшь кусок экрана, суёшь туда WebView, и он тебе сайты показывает. Базовый сценарий — проще пареной репы:

val webView = findViewById<WebView>(R.id.webView)
webView.settings.javaScriptEnabled = true
webView.loadUrl("https://example.com")

Вот и вся магия. Но тут, блядь, подвох сразу: если ты просто так ссылку загрузишь, то при клике на любую другую ссылку пользователя выкинет в системный браузер. А это, я тебе скажу, пользовательский опыт уровня «пизда рулю». Человек думает, что в приложении, а его уже в Chrome вынесло. Волнение ебать!

Чтобы этого не было, надо сказать WebView: «Слушай, дружок, все ссылки обрабатывай сам, не выёбывайся». Для этого нужен WebViewClient.

webView.webViewClient = WebViewClient()

Всё, теперь навигация будет внутри твоего View. Красота.

А теперь самое интересное — взаимодействие с JavaScript. Вот это уже мощь. Представь: у тебя на сайте кнопка, по нажатию которой должно что-то случиться в нативном коде. Например, открыться твой родной экран или отправиться данные. Делается это через JavascriptInterface.

webView.addJavascriptInterface(MyJsInterface(), "Android")

Ты создаёшь класс MyJsInterface, размечаешь методы аннотацией @JavascriptInterface, и они становятся доступны из JS как window.Android.твойМетод(). Прямо мост между мирами, ядрёна вошь!

Но, чувак, слушай сюда, это важно! Безопасность, мать её. WebView — это дыра в твоём приложении размером с чёрную дыру. Особенно эти интерфейсы.

  1. shouldOverrideUrlLoading — твой телохранитель. Всегда проверяй, какую ссылку пытаются открыть. Фильтруй схемы (tel:, mailto:, intent:), смотри домены. Иначе какой-нибудь хитрожопый скрипт уведёт пользователя куда не надо или, того хуже, запустит на телефоне какую-нибудь гадость. Доверия к контенту — ноль ебать.
  2. Уборка за собой. WebView — известный свинюшник в плане памяти. Если его неправильно обработать при уничтожении активити, он будет висеть в памяти и сосать ресурсы, как вампир. В onDestroy() обязательно отключай его от родителя, останавливай загрузку, чисть кэш и историю. Иначе приложение будет лагать и падать, а пользователи понесут однозвёздочные отзывы. Сам от себя охуеешь, когда начнёшь дебажить утечки.
  3. Тонкий лёд с API. Начиная с Android 9, по умолчанию HTTP-трафик (без SSL) запрещён. Если твой сайт без HTTPS, то WebView просто покажет пустую страницу или ошибку. Надо будет в манифесте танцевать с android:usesCleartextTraffic="true" или настраивать Network Security Config. А это уже, считай, признание, что твоё приложение — полупидор в плане безопасности.

Если тебе нужен не просто кусок сайта, а полноценная браузерная штука с прогресс-барами, менюшками и прочими плюшками, то лучше посмотреть в сторону Chrome Custom Tabs. Это как WebView, но сделанный профессионалами: быстрый, безопасный, с анимациями и возможностью шаринга. Но это уже отдельная история.

Короче, WebView — инструмент мощный, но с характером. Как старый мотоцикл: заведёшь — поедешь быстро, но если не следить, то в любой момент может накрыться медным тазом и бензина сожрать дохуя.