WKWebView梳理

如题所述

第1个回答  2022-06-09

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

WKWebView - API梳理

WKWebView - Cookie管理

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

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

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

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

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

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