WKWebView梳理

2021-09-17  本文已影响0人  崔可一

WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用、内存泄漏的 UIWebView。WKWebView 拥有60fps滚动刷新率、和 safari 相同的 JavaScript 引擎等优势。

1. UIWebView 和 WKWebView 的区别


2. WKWebView为什么比UIWebView高效


二者都是基于 JavaScriptCore 实现,它是一个在WebKit中提供 JavaScript 引擎的框架,苹果称之为Nitro。WKWebView高效原因之一是支持JIT(Just In Time)技术,而UIWebView不支持。

扩展阅读:JavaScript引擎JIT工作原理Nitro、JavaScriptCore 和 JIT

3. WKWebView - API介绍


WKWebView - API梳理

4. WKWebView - Cookie


WKWebView - Cookie管理

5. WKWebView 白屏问题


WKWebView 白屏的原因在于 WebContent Process 的 crash,当 WKWebView 在单独进程占用较大内存时,就会导致白屏,此时 WKWebView.URL 会变成 nil,此时调用 reload 方法刷新已经失效。
解决方案
a. WKNavigtionDelegate 代理

- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView API_AVAILABLE(macosx(10.11), ios(9.0)) {
    [webView reload];
}

当 WKWebView 总体内存占用过大,页面即将白屏的时候,系统会调用上面的回调函数,我们在该函数里执行[webView reload](这个时候 webView.URL 取值尚不为 nil)解决白屏问题。在一些高内存消耗的页面可能会频繁刷新当前页面,H5侧也要做相应的适配操作。

b. 检测 webView.title 是否为空
并不是所有H5页面白屏的时候都会调用上面的回调函数,比如,在一个高内存消耗的H5页面上 present 系统相机,拍照完毕后返回原来页面的时候出现白屏现象(拍照过程消耗了大量内存,导致内存紧张,WebContent Process 被系统挂起),但上面的回调函数并没有被调用。在WKWebView白屏的时候,另一种现象是 webView.titile 会被置空, 因此,可以在 viewWillAppear 的时候检测 webView.title 是否为空来 reload 页面。

综合以上两种方法可以解决绝大多数的白屏问题。

6. Native 与 JS 交互

iOS WKWebView与JS交互:https://www.jianshu.com/p/4d12d593ba60

7.拦截网络请求 && 离线化

WKWebView - 拦截网络请求 && 离线化

上一篇 下一篇

猜你喜欢

热点阅读