网页标题
使用 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 团队的一篇公众号文章