Разработано на Xcode 11.4 с использованием SwiftUI

Использование любого компонента из UIKit в SwiftUI необходимо было заключить в оболочку UIViewRepresentable. Но сначала, нам нужно понять, каковы основные требования для WKWebView.

  1. Состояния загрузки веб-страниц
  2. Заголовок веб-страницы, отображаемый при навигации.
  3. Пользователи могут вернуться на старые страницы.
  4. Делегаты при необходимости

Для пунктов 1–3 нам потребуется двусторонняя привязка. Если действие пользователя (например, вернуться на предыдущую страницу и т. Д.) Может быть передано в WKWebView, а WKWebView может передать информацию обратно, чтобы мы могли обновить состояние навигации и загрузки.

class WebViewStateModel: ObservableObject {
    @Published var pageTitle: String = "Web View"
    @Published var loading: Bool = false
    @Published var canGoBack: Bool = false
    @Published var goBack: Bool = false
}

Для делегатов мы можем использовать обратные вызовы или комбинировать. В этом руководстве я использую обратный вызов с делегированием на основе перечисления.

enum NavigationAction {
    case decidePolicy(WKNavigationAction,  (WKNavigationActionPolicy) -> Void) //mendetory
    case didRecieveAuthChallange(URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) //mendetory
    case didStartProvisionalNavigation(WKNavigation)
    case didReceiveServerRedirectForProvisionalNavigation(WKNavigation)
    case didCommit(WKNavigation)
    case didFinish(WKNavigation)
    case didFailProvisionalNavigation(WKNavigation,Error)
    case didFail(WKNavigation,Error)
}

Протокол UIViewRepresentable требует от нас реализации makeUIView, updateUIView, makeCoordinator, UIViewType, и т.д. Итак, теперь попробуем создать оболочку WebViewWrapper для SwiftUI.

Теперь, когда мы закончили создание представления, нам нужно установить делегат навигации координатора.

Теперь мы создаем наш WebView с помощью WebViewWrapper:

Как использовать:

Полный код: