Открыть сервис

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) не приводит к краху всего приложения.
  • Безопасность: нативный код приложения не может быть напрямую вызван из веб-контента без явного разрешения.
  • Производительность: тяжёлые операции (загрузка изображений, выполнение скриптов) не блокируют основной поток.

Основные компоненты

  1. WKWebView — основной класс, отвечающий за отображение веб-страницы. Он наследуется от UIView (iOS) или NSView (macOS) и поддерживает все стандартные методы для навигации, загрузки контента и управления историей.
  2. WKWebViewConfigurationобъект конфигурации, позволяющий настраивать поведение WKWebView: включать/отключать JavaScript, управлять хранилищем данных (cookies, localStorage), задавать пользовательские обработчики сообщений и т.д.
  3. WKUserContentController — компонент для внедрения пользовательских скриптов (JavaScript) в веб-страницу и обработки сообщений, отправляемых из веб-контента в нативный код.
  4. WKScriptMessageHandler — протокол, который реализуется для получения сообщений из JavaScript.
  5. WKUIDelegate — протокол для обработки UI-событий: открытие новых окон, отображение диалоговых окон (alert, confirm, prompt), управление контекстными меню.
  6. 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 широко используется в нативных приложениях для решения следующих задач:

  1. Встраивание веб-контента: отображение статей, новостей, документации, справки, лицензионных соглашений.
  2. Гибридные приложения: создание приложений, где часть интерфейса реализована на HTML/CSS/JavaScript, а часть — на Swift/Objective-C. Это позволяет быстро обновлять контент без публикации новой версии в App Store.
  3. Авторизация через OAuth/OpenID: многие сервисы (Google, Facebook, ВКонтакте) предоставляют веб-формы для входа, которые удобно открывать в WKWebView.
  4. Отображение интерактивных карт: например, Яндекс.Карты или Google Maps можно встраивать через JavaScript API.
  5. Игры и приложения на WebGL: WKWebView поддерживает WebGL, что позволяет запускать 3D-игры, написанные на JavaScript (например, с использованием Three.js или Babylon.js).
  6. Просмотр PDF и других документов: WKWebView может отображать PDF, DOCX, XLSX и другие форматы, если они поддерживаются браузером Safari.
  7. Платежные формы и корзины: в интернет-магазинах часто используется 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 →