Skip to content

Instantly share code, notes, and snippets.

@joshbetz
Created February 12, 2020 15:36
Show Gist options
  • Select an option

  • Save joshbetz/2ff5922203240d4685d5bdb5ada79105 to your computer and use it in GitHub Desktop.

Select an option

Save joshbetz/2ff5922203240d4685d5bdb5ada79105 to your computer and use it in GitHub Desktop.
A simple SwiftUI Webview
import SwiftUI
import WebKit
struct ContentView: View {
var body: some View {
Webview(url: URL(string: "https://google.com")!)
}
}
struct Webview: UIViewRepresentable {
let url: URL
func makeUIView(context: UIViewRepresentableContext<Webview>) -> WKWebView {
let webview = WKWebView()
let request = URLRequest(url: self.url, cachePolicy: .returnCacheDataElseLoad)
webview.load(request)
return webview
}
func updateUIView(_ webview: WKWebView, context: UIViewRepresentableContext<Webview>) {
let request = URLRequest(url: self.url, cachePolicy: .returnCacheDataElseLoad)
webview.load(request)
}
}
@cmercadogallardo

Copy link
Copy Markdown

How do I catch if the URL changed using your approach?

@valvoline

Copy link
Copy Markdown

Something like that should work for navigation handling:

import SwiftUI
import WebKit

struct SAWebView: View {
    var body: some View {
        Webview(url: URL(string: "https://google.com")!)
    }
}

struct Webview: UIViewRepresentable {
    let url: URL
    let navigationHelper = WebViewHelper()

    func makeUIView(context: UIViewRepresentableContext<Webview>) -> WKWebView {
        let webview = WKWebView()
        webview.navigationDelegate = navigationHelper

        let request = URLRequest(url: self.url, cachePolicy: .returnCacheDataElseLoad)
        webview.load(request)

        return webview
    }

    func updateUIView(_ webview: WKWebView, context: UIViewRepresentableContext<Webview>) {
        let request = URLRequest(url: self.url, cachePolicy: .returnCacheDataElseLoad)
        webview.load(request)
    }
}

class WebViewHelper: NSObject, WKNavigationDelegate {
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("webview didFinishNavigation")
    }
    
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        print("didStartProvisionalNavigation")
    }
    
    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
        print("webviewDidCommit")
    }
    
    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        print("didReceiveAuthenticationChallenge")
        completionHandler(.performDefaultHandling, nil)
    }
}

@haansplosion

Copy link
Copy Markdown

Hey man, this is great, thanks! How would you access the currently loaded URL?

@AP-94

AP-94 commented Dec 5, 2021

Copy link
Copy Markdown

Great way to display WebView in SwiftUI, thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment