Android Hybrid经验
容器最初的设计是为上层H5输出native以及设备能力,因此下层的能力如何能输出给H5就很重要,因此容器作为一个桥梁,起着承H5启Native的作用。对于其中如何进行通讯,可以参考其他容器bridge的实现,大同小异,但是说一下其中几点:
在android里,js调用native的通讯是是通过console.log的方式。其他容器(微信)一般通过prompt的方式来实现的,但是使用prompt的方式,有两个弊端:
a.使用prompt会阻断整个浏览器的进程,如果native处理时间一长,会导致页面假死。 b. prompt是在ui层面上会弹出一个模态窗口,在native没有对其进行捕获处理的话,会造成一个问题。一旦这个页面放在非此容器的环境下,就会出现一个很诡异的prompt弹窗。 在支付宝内,曾经出现过这个问题,天猫页面在支付宝app里的时候,由于容器机制不同,淘系容器采用的是prompt的机制,页面中bridge脚本没有判断环境,导致页面中js调用淘系的api的时候,在页面上出现了promot的模态对话框,严重影响了用户体验,但是如果使用console.log的化,就不会出现这个问题。console的方式避免了不兼容环境的体验问题和同时也避免了页面的假死。
jsbridge注入的时机,由于业务逻辑要依赖bridge,所以业务的所有逻辑都会在bridge ready之后才会触发,而bridge js本身运行是要一定的时间的,因此注入的时机对于性能的影响显得非常的重要。但由于H5页面的生命周期和容器的生命周期是相互独立的,因此在H5生命周期的哪个阶段注入这段bridgejs,对于性能的影响就显得异常重要。现在在支付宝内使用的方式为监听H5生活周期的事件,比如说当webview设置title结束之后,android会放出一个onReceivedTitle的事件,shouldInterceptRequest等事件,ios会尝试在webViewDidStartLoad事件,在监听到这些事件之后,立即注入bridgejs,让其在H5生命周期尽早运行。通过这种方式的注入,经过测试,最早能在页面加载开始后,50ms以内就能成功注入bridgejs。