美文网首页
WKWebView梳理

WKWebView梳理

作者: 崔可一 | 来源:发表于2021-09-17 11:23 被阅读0次

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

    1. UIWebView 和 WKWebView 的区别


    • UIWebView使用UIKit框架,而WKWebView使用WebKit.framework。WKWebView采用与Safari 相同的 Nitro JavaScript 引擎,在cpu资源消耗方面,远低于UIWebView。

    • WKWebView为多进程组件,会从App内存中分离内存到单独的进程(Network Process and Rendring Process)中。当内存超过了系统分配给WKWebView的内存时候,会导致WKWebView浏览器崩溃白屏,但是App不会Crash(app会收到系统通知,并且尝试去重新加载页面)。相反UIWebView是和app同一个进程,UIWebView加载页面占用的内存被计算为app内存占用的一部分,当app超过了系统分配的内存,则会被操作系统crash。在整个过程中,会经常收到iOS系统的通知用来防止app被系统kill,很多时候,这些通知并不及时,或者根本没有返回通知。

    • WKWebView是异步处理native与JavaScript之间的通信,所以执行速度会更快。

    • WKWevbView内存消耗较UIWebView大幅下降,WKWebView有着高达60fps的滚动刷新率以及内置手势,WKWevView更多的支持 HTML5 的特性,比如 IndexedDB 和 ObjectStore ArrayBuffer。

    • WKWevbView的Cookie存储体系与 UIWebVIew 完全不一样,需手动添加 Cookie,下文中会详细介绍。

    • WKWebView与 UIWebView 机制不同:加载过程中所有的请求都不经过 NSURLProtocol,也就是WKWebView无法拦截响应数据,下文中会详细介绍。

    • WKWebView 的loading、title、estimatedProgress三个属性支持KVO。

    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 - 拦截网络请求 && 离线化

    相关文章

      网友评论

          本文标题:WKWebView梳理

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