WKUIDelegate

// * 根据webView、navigationAction相关信息决定这次跳转是否可以继续进行,这些信息包含HTTP发送请求,如头部包含User-Agent,Accept,refer
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
         decisionHandler(WKNavigationActionPolicy.allow)
    }
    
    // * 这个代理方法表示当客户端收到服务器的响应头,根据response相关信息,可以决定这次跳转是否可以继续进行。
    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
        decisionHandler(WKNavigationResponsePolicy.allow)
    }
    
    //页面开始加载时调用
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        
    }
    
    //这个代理是服务器redirect时调用
    func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
        
    }
    
    //当内容开始到达时调用。内容开始加载. 等同于UIWebViewDelegate: - webViewDidStartLoad:
    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
        
    }
    
    //页面加载完成之后调用。 等同于UIWebViewDelegate: - webViewDidFinishLoad:
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        
    }
    
    //页面加载失败。 等同于UIWebViewDelegate: - webView:didFailLoadWithError:
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        
    }
    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        
    }

WKUIDelegate

iOS8的几个方法(iOS10略)

 /*! @abstract Creates a new web view.
    返回的Web视图必须使用指定的配置创建。 WebKit将在返回的Web视图中加载请求。    
    如果您未实现此方法,则Web视图将取消导航。
     */
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration /*创建新视图的配置*/, for navigationAction: WKNavigationAction /*导致创建新的Web视图的导航操作。*/, windowFeatures: WKWindowFeatures) -> WKWebView?

    
    /* 通知您的应用程序DOM窗口对象的close()方法已成功完成。
       据需要使用UI,例如关闭包含的浏览器选项卡或窗口。
      */
    @available(iOS 9.0, *)
    optional public func webViewDidClose(_ webView: WKWebView)

    
    /* 警告框 ( The panel should have a single OK button.)
           如果您没有实现此方法,则Web视图的行为就好像用户选择了“ok”按钮
     */
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Swift.Void)

    
    /* 展示确认面板
       如果您没有实现此方法,则Web视图的行为就好像用户选择了“取消”按钮
     */
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String /*需要展示的消息*/, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Swift.Void)

    
    //输入框.
    @available(iOS 8.0, *)
    optional public func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String /*需要展示的消息*/, defaultText: String? /*需要展示再输入框的初始信息*/, initiatedByFrame frame: WKFrameInfo /*有关JavaScript启动此调用的框架的信息。*/, completionHandler: @escaping (String?) -> Swift.Void /*为了用户着想,你需要判断url(frame.request.URL.host)来控制此面板中的内容;  面板应该有两个按钮,例如OK和Cancel,以及一个输入文本。*/)

WKWebView 中,前端 window 对象里的 alert()、confirm() 和 prompt() 被前端调用是不会直接显示的,需要在 WKUIDelegate 中进行重写。

例如:

func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
        
        let alert = UIAlertView.init(title: nil , message: message, delegate: nil, cancelButtonTitle: "确定")
        alert.show()
        completionHandler()
    }