参考资料:
NSHipster -- WKWebView 胡椒的笔记本 -- iOS与JavaScript交互系列

WKWebView

参考资料中的已经介绍了WKWebView与UIWebView的对比和WKWebView的基本使用、代理方法、与JavaScript的交互。这里就不再重复写了。

下面简单总结一下WKWebView与JavaScript的交互:

WKWebView与JavaScript的交互与UIWebView不同,他不依赖于JavaScriptCore,交互的方式封装到了WKWebView的内部。

  1. WKWebView调JS:

    open func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Swift.Void)? = nil)
    

    方法直接位于WKWebView中,一般在WKWebView加载完成后调用。如PADemo中的例子:

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
         // 加载完页面后调用里面的JS代码
         webView.evaluateJavaScript("sumValue(1, 2)") { (response, error) in
             let result = response as? Int
             print(result ?? -1)
             print(error ?? "success")
         }
     }
    
  2. JS调用WkWebView: 这个要间接一点,需用通过WKWebView中的configuration属性中的userContentController属性。

     // WKWebView
     @NSCopying open var configuration: WKWebViewConfiguration { get }
     // WKWebViewConfiguration
     open var userContentController: WKUserContentController
    

    通过下面的add函数添加方法,在JS中通过window.webkit.messageHandlers.funcName.postMessage({参数})来通知方法的执行。添加方法一般放在WKWebView加载之前。

     /*! @abstract Adds a script message handler.
      @param scriptMessageHandler The message handler to add.
      @param name The name of the message handler.
      @discussion Adding a scriptMessageHandler adds a function
      window.webkit.messageHandlers.<name>.postMessage(<messageBody>) for all
      frames.
      */
     open func add(_ scriptMessageHandler: WKScriptMessageHandler, name: String)
    

    服从WKScriptMessageHandler协议的scriptMessageHandler实例可以在代理方法中收到来自JS对add过函数的通知(调用)

    public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
    

    通过上面的方法,WKWebView会对WKScriptMessageHandler实例强引用,所以需要在合适的时机将其remove掉。

     /*! @abstract Removes a script message handler.
      @param name The name of the message handler to remove.
      */
     open func removeScriptMessageHandler(forName name: String)
    

    具体可参考PADemo中KSWKWebViewController中的代码例子,这里就不再粘贴。

  3. WKUIDelegate提供原生控件显示网页方法的回调。

Copyright © shuoliu.com 2018 all right reserved,powered by Gitbook该文件修订时间: 2018-09-03 03:46:41

results matching ""

    No results matching ""