WKWebView
WKWebView — это компонент фреймворка WebKit, предоставляемый в операционных системах Apple (iOS, iPadOS, macOS, tvOS, watchOS) для встраивания веб-контента в интерфейс нативных приложений. Он представляет собой объектно-ориентированную обёртку над движком WebKit (основанном на форке KHTML и используемом в браузере Safari) и предназначен для отображения HTML-страниц, выполнения JavaScript, обработки пользовательского ввода и взаимодействия между нативным кодом и веб-содержимым. WKWebView пришёл на смену устаревшему UIWebView в iOS 8 и macOS 10.10 (Yosemite) и с тех пор является стандартным средством для работы с веб-контентом в экосистеме Apple.
История
До появления WKWebView разработчики iOS и macOS использовали класс UIWebView (для iOS) и WebView (для macOS). UIWebView был представлен в iPhone OS 1 (2007 год) и базировался на устаревшей версии WebKit. Он имел ряд недостатков: низкая производительность, отсутствие поддержки современных веб-стандартов, утечки памяти, невозможность эффективного управления загрузкой ресурсов и слабая интеграция с нативным кодом.
В 2014 году на конференции WWDC компания Apple анонсировала WKWebView как часть фреймворка WebKit. Основные причины создания нового компонента:
- Производительность: WKWebView использует отдельный процесс для рендеринга веб-страниц (аналогично Safari), что снижает нагрузку на основной поток приложения и предотвращает зависания интерфейса при загрузке тяжёлого контента.
- Безопасность: изоляция процессов предотвращает доступ вредоносного JavaScript к данным нативного приложения.
- Современные возможности: поддержка HTML5, CSS3, WebGL, IndexedDB, Service Workers (с iOS 13 / macOS 10.15) и других современных веб-технологий.
- Управление памятью: автоматическое освобождение ресурсов при закрытии вкладок.
С выходом iOS 8 (сентябрь 2014) и macOS 10.10 (октябрь 2014) WKWebView стал доступен для использования. В 2020 году Apple объявила о прекращении поддержки UIWebView — с апреля 2020 года все новые приложения, загружаемые в App Store, должны использовать WKWebView, а с декабря 2020 года — и обновления существующих приложений. Таким образом, WKWebView стал единственным официально поддерживаемым способом встраивания веб-контента в приложения Apple.
Архитектура и устройство
WKWebView построен на архитектуре с разделением процессов (out-of-process rendering). Веб-контент обрабатывается в отдельном процессе, называемом WebContent process, который изолирован от основного процесса приложения. Это обеспечивает:
- Стабильность: сбой в рендеринге веб-страницы (например, из-за ошибки JavaScript) не приводит к краху всего приложения.
- Безопасность: нативный код приложения не может быть напрямую вызван из веб-контента без явного разрешения.
- Производительность: тяжёлые операции (загрузка изображений, выполнение скриптов) не блокируют основной поток.
Основные компоненты
- WKWebView — основной класс, отвечающий за отображение веб-страницы. Он наследуется от UIView (iOS) или NSView (macOS) и поддерживает все стандартные методы для навигации, загрузки контента и управления историей.
- WKWebViewConfiguration — объект конфигурации, позволяющий настраивать поведение WKWebView: включать/отключать JavaScript, управлять хранилищем данных (cookies, localStorage), задавать пользовательские обработчики сообщений и т.д.
- WKUserContentController — компонент для внедрения пользовательских скриптов (JavaScript) в веб-страницу и обработки сообщений, отправляемых из веб-контента в нативный код.
- WKScriptMessageHandler — протокол, который реализуется для получения сообщений из JavaScript.
- WKUIDelegate — протокол для обработки UI-событий: открытие новых окон, отображение диалоговых окон (alert, confirm, prompt), управление контекстными меню.
- WKNavigationDelegate — протокол для управления навигацией: отслеживание загрузки страниц, перенаправлений, обработка ошибок, принятие решений о разрешении или блокировке переходов.
Взаимодействие с нативным кодом
WKWebView предоставляет два основных механизма для обмена данными между нативным кодом и веб-контентом:
- Внедрение JavaScript: через метод
evaluateJavaScript(_:completionHandler:)можно выполнить произвольный JavaScript-код в контексте веб-страницы и получить результат. - Сообщения: через
WKUserContentControllerможно зарегистрировать обработчик сообщений, который будет вызываться из JavaScript с помощьюwindow.webkit.messageHandlers.<имя>.postMessage(<данные>). Это позволяет передавать структурированные данные (словари, строки, числа) из веб-контента в нативное приложение.
Ключевые возможности
Поддержка современных веб-стандартов
WKWebView полностью поддерживает HTML5, CSS3, ECMAScript 6 и выше, WebGL, WebAssembly (с iOS 11 / macOS 10.13), WebRTC (с iOS 11 / macOS 10.13), Service Workers (с iOS 13 / macOS 10.15), IndexedDB, и другие современные API. Это позволяет встраивать в приложения сложные веб-приложения, игры, редакторы и интерактивные карты.
Управление навигацией
WKNavigationDelegate позволяет:
- Отслеживать начало и завершение загрузки страницы.
- Перенаправлять или блокировать загрузку определённых URL (например, для фильтрации рекламы или ограничения доступа).
- Обрабатывать ошибки загрузки (таймауты, недоступность сервера).
- Управлять историей переходов (назад/вперёд).
Обработка жестов и взаимодействие
WKWebView поддерживает все стандартные жесты: масштабирование (pinch-to-zoom), прокрутку, нажатие ссылок. Можно настраивать поведение жестов через свойства allowsBackForwardNavigationGestures (свайпы для навигации), allowsLinkPreview (предпросмотр ссылок при долгом нажатии на iOS) и magnification (программное масштабирование на macOS).
Кэширование и хранилища
WKWebView использует собственное HTTP-кэширование, управляемое через URLCache. Также поддерживаются:
- Cookies: управляются через
WKHTTPCookieStore. - LocalStorage и SessionStorage: автоматически управляются WebKit, данные хранятся в отдельном хранилище для каждого приложения.
- IndexedDB: поддерживается для хранения структурированных данных.
Настройка внешнего вида
WKWebView позволяет настраивать:
- Цвет фона (свойство
backgroundColor). - Прозрачность (свойство
isOpaque). - Отображение полос прокрутки (свойство
scrollView.showsVerticalScrollIndicatorиscrollView.showsHorizontalScrollIndicator). - Отключение масштабирования (через мета-тег
viewportили JavaScript).
Применение
WKWebView широко используется в нативных приложениях для решения следующих задач:
- Встраивание веб-контента: отображение статей, новостей, документации, справки, лицензионных соглашений.
- Гибридные приложения: создание приложений, где часть интерфейса реализована на HTML/CSS/JavaScript, а часть — на Swift/Objective-C. Это позволяет быстро обновлять контент без публикации новой версии в App Store.
- Авторизация через OAuth/OpenID: многие сервисы (Google, Facebook, ВКонтакте) предоставляют веб-формы для входа, которые удобно открывать в WKWebView.
- Отображение интерактивных карт: например, Яндекс.Карты или Google Maps можно встраивать через JavaScript API.
- Игры и приложения на WebGL: WKWebView поддерживает WebGL, что позволяет запускать 3D-игры, написанные на JavaScript (например, с использованием Three.js или Babylon.js).
- Просмотр PDF и других документов: WKWebView может отображать PDF, DOCX, XLSX и другие форматы, если они поддерживаются браузером Safari.
- Платежные формы и корзины: в интернет-магазинах часто используется WKWebView для отображения страниц оплаты, чтобы не передавать чувствительные данные через нативный код.
Ограничения и критика
Несмотря на преимущества, WKWebView имеет ряд ограничений:
- Отсутствие полного контроля над кэшированием: в отличие от UIWebView, WKWebView не позволяет напрямую управлять кэшем через NSURLCache. Разработчики могут использовать только
WKWebsiteDataStoreдля удаления данных. - Проблемы с куками: куки, установленные в WKWebView, не синхронизируются с куками Safari или других приложений. Это может создавать неудобства при реализации единой авторизации.
- Ограниченная поддержка Service Workers: хотя Service Workers поддерживаются с iOS 13, они работают только в рамках одного WKWebView и не могут быть использованы для фоновой синхронизации или push-уведомлений.
- Отсутствие поддержки Flash и Silverlight: WKWebView не поддерживает устаревшие плагины, что может быть проблемой для старых веб-сайтов.
- Сложность отладки: из-за изоляции процессов отладка JavaScript-кода в WKWebView сложнее, чем в Safari. Для отладки требуется использовать Safari Web Inspector на macOS или эмулятор iOS.
- Проблемы с памятью: при открытии множества вкладок или загрузке тяжёлых страниц WKWebView может потреблять значительный объём оперативной памяти, что может привести к выгрузке страницы системой (особенно на старых устройствах).
Сравнение с UIWebView
| Характеристика | UIWebView (устарел) | WKWebView |
|---|---|---|
| Рендеринг | В основном процессе | В отдельном процессе |
| Производительность | Низкая, частые зависания | Высокая, плавная прокрутка |
| Поддержка JavaScript | Ограниченная | Полная (ES6+, WebAssembly) |
| Управление памятью | Ручное, утечки | Автоматическое, изоляция |
| Поддержка WebGL | Нет | Да (с iOS 8) |
| Service Workers | Нет | Да (с iOS 13) |
| Взаимодействие с нативным кодом | Через UIWebViewDelegate | Через WKScriptMessageHandler |
| Поддержка Apple | Прекращена в 2020 | Активная |
Интересные факты
- WKWebView использует тот же движок WebKit, что и браузер Safari, но с некоторыми отличиями: например, в WKWebView отключены некоторые функции, связанные с безопасностью (например, блокировщики контента не работают по умолчанию).
- В iOS 14 и macOS 11 появилась возможность использовать WKWebView для отображения веб-страниц в режиме «картинка в картинке» (Picture-in-Picture) для видео.
- WKWebView поддерживает пользовательские схемы URL (например,
myapp://), что позволяет нативному коду обрабатывать переходы из веб-контента. - В macOS WKWebView может быть использован для создания виджетов в панели «Сегодня» (Today View) и в расширениях Safari.
Источники
- Apple Developer Documentation: WKWebView
- WWDC 2014 Session 511: Introducing WKWebView
- WWDC 2018 Session 242: WebKit in iOS 12
- WWDC 2019 Session 207: Web Inspector in Safari
- Статья «UIWebView vs WKWebView» на сайте NSHipster
- Документация WebKit Open Source Project
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →