I'm creating a web app on Xcode v11 and having a trouble implementing WKUIDelegate to display Javascript alert and confirm properly on the web app.
I got a very simple webview app with below code on ContentView.swift but not sure how to implement WKUIDelegate properly with this code.
import SwiftUI
import WebKit
struct Webview : UIViewRepresentable {
    let request: URLRequest
    var webview: WKWebView?
    init(web: WKWebView?, req: URLRequest) {
        self.webview = WKWebView()
        self.request = req
    }
    func makeUIView(context: Context) -> WKWebView  {
        return webview!
    }
    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.load(request)
    }
    func goBack(){
        webview?.goBack()
    }
    func goForward(){
        webview?.goForward()
    }
    func reload(){
        webview?.reload()
    }
}
struct ContentView: View {
    let webview = Webview(web: nil, req: URLRequest(url: URL(string: "https://google.com")!))
    var body: some View {
        VStack {
            webview
            HStack() {
                Button(action: {
                    self.webview.goBack()
                }){
                    Image(systemName: "chevron.left")
                }.padding(32)
                Button(action: {
                    self.webview.reload()
                }){
                    Image(systemName: "arrow.clockwise")
                }.padding(32)
                Button(action: {
                    self.webview.goForward()
                }){
                    Image(systemName: "chevron.right")
                }.padding(32)
            }.frame(height: 32)
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
What is the best way to implement WKUIDelegate into this code? So, it will display Javascript Alert and Confirm properly.
First add the web view as a UIWebView outlet in the storyboard / IB. This will give you a property like this: @property (weak, nonatomic) IBOutlet UIWebView *webView; Then just edit your code to change it to a WKWebView.
You can implement WKWebView in Objective-C, here is simple example to initiate a WKWebView : WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; WKWebView *webView = [[WKWebView alloc] initWithFrame:self. view. frame configuration:theConfiguration]; webView.
You need to use Coordinator and then conform to WKUIDelegate:
class Coordinator: NSObject, WKUIDelegate {
    var parent: Webview
    init(_ parent: Webview) {
        self.parent = parent
    }
    // Delegate methods go here
    func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
        // alert functionality goes here
    }
}
func makeCoordinator() -> Coordinator {
    Coordinator(self)
}
Then ensure your updateUIView(..) sets the uiDelegate to the context.coordinator:
func updateUIView(_ uiView: WKWebView, context: Context) {
    uiView.uiDelegate = context.coordinator
    [...]
}
If you want to conform to
WKNavigationDelegatethen conform to it and set thenavigationDelegateto thecontext.coordinatoras well.
Full code here:
import SwiftUI
import WebKit
struct Webview : UIViewRepresentable {
    let request: URLRequest
    var webview: WKWebView?
    init(web: WKWebView?, req: URLRequest) {
        self.webview = WKWebView()
        self.request = req
    }
    class Coordinator: NSObject, WKUIDelegate {
        var parent: Webview
        init(_ parent: Webview) {
            self.parent = parent
        }
        // Delegate methods go here
        func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
            // alert functionality goes here
        }
    }
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    func makeUIView(context: Context) -> WKWebView  {
        return webview!
    }
    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.uiDelegate = context.coordinator
        uiView.load(request)
    }
    func goBack(){
        webview?.goBack()
    }
    func goForward(){
        webview?.goForward()
    }
    func reload(){
        webview?.reload()
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With