混合开发是在app原生开发应用(Native端,父级节点)中嵌套一个轻量级的浏览器插件(webview,即h5端,子级节点,是Native端环境中浏览器的一个映射对象),用浏览器去运行h5代码并展示在浏览器中; Native端与h5端可以进行数据交互,两端进行交互的方案被称作JSBridge。Native端(父级)可以直接通过访问h5端(子级)window对象上的对象、方法进行数据传递,但是h5端(子级)不能直接通过访问Native端(父级)中的代码进行数据传递。h5端(子级)向Native端(父级)传递数据可以通过Scheme协议拦截、弹窗拦截和注入上下文(原生注入)的方式进行通信。 由于h5端在开发效率、渲染展示方面和Native端在性能、丰富sdk方面的优势,所以结合两端优势、利用双端数据交互可以开发出更加满足需求的app应用。
我目前做的这个混合开发项目是一个基于安卓系统开发的,Native端是通过原生注入方式往h5端window对象上添加API--WebViewJavascriptBridge 对象,然后通过WebViewJavascriptBridge.callHandler(SDKName,paramObj,callBack(e))调用Native端原生方法。前端把每一个可调用的原生sdk的步奏封装成一个函数方法添加到一个对象上YW,最后把包含所有封装sdk的函数方法的对象YW添加到window对象上,最后通过YW.SDKName(paramObj)就可以调用了。
我是h5开发工程师,不是原生开发工程师,所以Native端是如何实现原生注入的,我不需要关注,我只需要关注注入到window对象上的API接口怎末调用就行。h5端的开发我本身就懂,所以没什么需要学习的;所以关于混合开发只有Native端与h5端进行数据交互这一部分需要我学习了解,这也是混合开发的一个重点,也是我写这篇文章的目的。下面的内容就是Native端与h5端进行数据交互的详细内容。
URL Scheme 是一种特殊的 URL,一般用于在 Web 端唤醒 App,甚至跳转到 App 的某个页面,比如在某个手机网站上付款的时候,可以直接拉起支付宝支付页面。
我们常说的 Deeplink 一般也是基于 URL Scheme 来实现的。一个 URI 的组成结构如下:
`URI = scheme:[//authority]path[?query][#fragment]
// scheme = http
// authority = www.baidu.com
// path = /link
// query = url=xxxxx
authority = [userinfo@]host[:port]`
除了 http/https 这两个常见的协议,还可以自定义协议。借用维基百科的一张图: