DSBridge:在原生 WebView 中实现企业级 H5 ↔ Native 通信(支持异步 / 多次回调 / 命名空间)
如果说:
Token 注入 解决 H5 与 App 登录态一致,
离线包热更新 解决 H5 内容更新效率与离线能力,
那么今天要解决的,是:
通信能力 —— H5 如何调用 App 原生能力?
例如:
H5 想调用扫码
H5 想让原生执行鉴权刷新 Token
离线包更新时希望把“下载 / 解压进度”实时回传给 H5
很多人第一反应:
用
addJavascriptInterface()就行了啊。
但——
一、为什么不使用 addJavascriptInterface()?
Android 原生 WebView 提供了通信 API:
H5 → 原生:
addJavascriptInterface()
原生 → H5:
evaluateJavascript() / loadUrl("javascript:…")
看起来能用,但有 致命缺陷:
1)不能异步
只能 return 一个同步结果,业务型操作(扫码、支付、文件上传)完全不够。
2)不能多次回调
H5 无法接收连续回调,例如:
下载进度
蓝牙/MQTT 数据持续输出
离线包实时回传进度
3)没有命名空间,接口暴露在全局
JavaScript 层只能这样:
native.getUserInfo()
容易被其他框架覆盖,也 不安全。
4)低版本 Android 存在已公开的远程代码执行漏洞
(Android 4.2 以下),即可以执行任意 Java 方法。
所以 addJavascriptInterface 只适合 demo,不适合企业项目上线。
