如何设计一个好的webview容器

前言

众所周知,iOS的网页组件很封闭,基本就是基于WKWebview修修改改。看起来能做的不多,但是一个好的webview容器,其实能做的事情还有很多。今天想聊一下,一个好的webview的容器,除了自己本身的功能,还需要哪些设计。

1.jsbridge的设计

wk很容易就可以使用jsbridge,只要在configuration.userContentController注入调用名

- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;

在js中附上刚面的name就可以调用了,非常方便

window.webkit.messageHandlers.name.postMessage()

同时也可以在想要的时间点(一般在初始过程)注入JS。


[userContentController addUserScript:[[WKUserScript alloc] initWithSource:script
                                                                        injectionTime:WKUserScriptInjectionTimeAtDocumentStart
                                                                     forMainFrameOnly:YES]];

健全的容器,需要健全的bridge方法,比如容器的版本,基础的设备信息等等。业务功能比如照片选择器、图片浏览器、原生扫码页、蓝牙等等,都可以按需加入。当然光提供bridge,几个还好,一旦多起来,他们就需要体系,接收方法需要统一入口,交由容器解析,有一套健全的派发逻辑,因为native的方法代码可能散落在工程各处。返回结果需要统一出口,由容器统一格式返回。

而在js端调用的过程中需要规范调用的格式,入参的规则,成功和失败的回调规则。当native执行完毕之后,需要告知js侧结果。

image-20210903110547976.png

2.同层渲染

让网页拥有原生组件的能力,这是近两年比较火的同层渲染技术。

市面上的实现原理也已经比较成熟,具体实现可以看微信这篇小程序同层渲染原理剖析写的非常详细。

github上也有相关的源码级别实现。iOS的做法来说相对来说“trick”一些,而android在实现上会更加复杂一点。

3.离线加载

故名思议通过加载本地的资源进行网页的渲染,达到网页秒开的效果。

在这其中,资源的动态的下发是比较重要的一环,下发的时间点,如何正确的命中用户都是需要做的课题。后续数据的追溯,命中情况等都需要监控。

当然,资源的管理是一方面,如果正确识别需要加载的URL绕过网络去加载本地的资源的这个过程同样需要精细化设计。WKWebView的请求拦截,网上基本说烂了,这篇文章基本是结贴WKWebView 请求拦截探索与实践。市面上思路都差不多,"WKWebView不支持http、https拦截"、"Body丢失"、"Cookie同步"这些问题只要花时间都是有解的。

补充:关于body丢失的问题,不管是用NSURLProtocol或者WKURLSchemeHandler,基本都是需要js端配合hook XMLHTTPRequest,只需在容器启动从native注入hook的js,对前端同学同样也是透明的,没有负担。

4.性能稳定监控

基本的性能监控不能少,统计网页从打开到显示的时间,网页加载完毕时候统计是否是白屏等等。

也可以通过一些网页的属性传给网页进行统计比如window.performance

补充:白屏的几种判别方法:1.截图像素点的判断。2.遍历dom节点查看是否有正常子节点。

5.预热

今日头条的详情页部分是通过WKWebView进行渲染的,好的用户体验的一个很重要的点就是wk的预热和复用,详见参考中的链接。

6.其他

大的块暂时能想到的就这么多,剩下的定制化功能其实还有很多,开发者可以不断地往上垒,治理好bridge是关键,比如容器可以支持查看js日志,并且在线调试,增加一些对navibar,navibaritem,横屏,手势等进行设置的功能,又比如将网页一些耗时任务交给native处理,在体验上也会有不错的效果。

总结

相比于flutter,我其实更崇尚基于native + h5的这种hybrid开发,随着h5的体验越来越好,其实这种开发方式已经是目前主流的开发模式了,不管是从效率、易用、容错等方面都是一个相当不错的选择。

参考

今日头条品质优化 - 图文详情页秒开实践

小程序同层渲染原理剖析

WKWebView 请求拦截探索与实践

WBWebViewConsole

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342