Swiftpack.co -  globulus/swiftui-webview as Swift Package
Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
Stateful WebView for SwiftUI.
.package(url: "https://github.com/globulus/swiftui-webview.git", from: "1.0.2")

Stateful SwiftUI WebView for iOS and MacOS

Fully functional, SwiftUI-ready WebView for iOS 13+ and MacOS 10.15+. Actions and state are both delivered via SwiftUI @Bindings, meaking it dead-easy to integrate into any existing SwiftUI View.

Preview iOS

Preview macOS


This component is distributed as a Swift package.

Sample usage

  • The action binding is used to control the WebView - whichever action you want it to perform, just set the variable's value to it. Available actions:
    • idle - does nothing and can be used as the default value.
    • load(URLRequest) - loads the given request.
    • loadHTML(String) - loads custom HTML string.
    • reload
    • goBack
    • goForward
  • The state binding reports back the current state of the WebView. Available data:
    • isLoading - true if the WebView is currently loading a page.
    • pageTitle - the title of the currently loaded page, or nil if it can't be obtained.
    • pageHTML - the HTML code of the page content. Set htmlInState: true in WebView initializer to receive this update.
    • error - set if an error ocurred while loading the page, nil otherwise.
    • canGoBack
    • canGoForward
  • The optional restrictedPages array allows you to specify hosts which the web view won't load.
  • htmlInState dictates if the state update will contain pageHTML. This is disabled by default as it's a costly operation.
import SwiftUIWebView

struct WebViewTest: View {
    @State private var action = WebViewAction.idle
    @State private var state = WebViewState.empty
    @State private var address = "https://www.google.com"
    var body: some View {
        VStack {
            WebView(action: $action,
                    state: $state,
                    restrictedPages: ["apple.com"])
    private var titleView: some View {
        Text(state.pageTitle ?? "Load a page")
            .font(.system(size: 24))
    private var navigationToolbar: some View {
        HStack(spacing: 10) {
            TextField("Address", text: $address)
            if state.isLoading {
                if #available(iOS 14, macOS 10.15, *) {
                } else {
            Button("Go") {
                if let url = URL(string: address) {
                    action = .load(URLRequest(url: url))
            Button(action: {
                action = .reload
            }) {
                Image(systemName: "arrow.counterclockwise")
            if state.canGoBack {
                Button(action: {
                    action = .goBack
                }) {
                    Image(systemName: "chevron.left")
            if state.canGoForward {
                Button(action: {
                    action = .goForward
                }) {
                Image(systemName: "chevron.right")
    private var errorView: some View {
        Group {
            if let error = state.error {


For a more detailed description of the code, visit this recipe. Check out SwiftUIRecipes.com for more SwiftUI recipes!


Stars: 8
Last commit: 4 weeks ago

Ad: Job Offers

iOS Software Engineer @ Perry Street Software
Perry Street Software is Jack’d and SCRUFF. We are two of the world’s largest gay, bi, trans and queer social dating apps on iOS and Android. Our brands reach more than 20 million members worldwide so members can connect, meet and express themselves on a platform that prioritizes privacy and security. We invest heavily into SwiftUI and using Swift Packages to modularize the codebase.

Submit a free job ad (while I'm testing this). The analytics numbers for this website are here.

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics