欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

WKWebView 使用

程序员文章站 2022-03-20 14:57:57
...

网页标题

使用 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 那些坑