WKWebView 使用

作者: azhunchen | 来源:发表于2017-02-08 21:45 被阅读278次

    网页标题

    使用 KVO 获取标题

    self.webView.addObserver(self, forKeyPath: "title", options: .new, context: nil)
    

    加载进度

    同样使用 KVO 获取

    self.webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
    

    屏幕边缘右滑返回

    这个特性在 UIWebView 上是没有的,省去了很多事情

    self.webView.allowsBackForwardNavigationGestures = true
    

    写入 cookie

    写入 cookie 有两个时机

    • 在 WKWebView load request 时,将 cookie 写入到 http header 中

      需要注意的时,如果有多个 key-value 键值对的话,以分号分隔

      let request = NSMutableURLRequest(url: "your url", cachePolicy:.returnCacheDataElseLoad, timeoutInterval: 60)
      request.addValue("key1=value1;key2=value2;key3=value3", forHTTPHeaderField: "Cookie")
      
    • 使用 Script 注入

      特别注意 cookie 的格式:单引号不能少,分号也不能少,否则会写入失败

      // 特别注意 cookie 的格式:单引号不能少,分号也不能少,否则会写入失败
      let cookie = "document.cookie = 'key1=value1; path=yourPath; domain=your.domain'; document.cookie = 'key2=value2; path=yourPath; domain=your.domain';"
      self.webView.configuration.userContentController.addUserScript(WKUserScript(source: cookie, injectionTime: .atDocumentStart, forMainFrameOnly: false))
      

    JS 调 Native 方法

    实现 WKScriptMessageHandler

    override func viewDidLoad() {
        super.viewDidLoad()
        self.webView.configuration.userContentController.add(self, name: "yourName")
    }
    
    // MARK: - WKScriptMessageHandler
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        // JS 调用 native 分享功能
        if message.name == "yourName" {
            if let body = (message.body as AnyObject).description {
                // do something
            }
        }
    }
    

    在 Web 端使用下面的 JavaScript

    // NAME 即上面 Swift 代码中的 yourName
    // param 即上面 Swift 代码中的 message.body 的值
    window.webkit.messageHandlers.{NAME}.postMessage(param)
    

    Native 调 JS

    其实上面的 cookie 已经讲过了

    let source = "document.body.style.background = \"#fff\";"
    self.webView.configuration.userContentController.addUserScript(WKUserScript(source: source, injectionTime: .atDocumentStart, forMainFrameOnly: false))
    

    其它就不一一补充了

    另外分享一下腾讯 Bugly 团队的一篇公众号文章

    WKWebView 那些坑

    相关文章

      网友评论

        本文标题:WKWebView 使用

        本文链接:https://www.haomeiwen.com/subject/iuvbittx.html