webview
概念
- 原生:安卓或者ios的原生开发,发布需要打包整个app,效率较低但是性能更好;
- webH5:跨平台开发,性能较差,但是开发方便,兼容性好;
核心机制:
- 解析 html,css,js
- 隔离的JS Runtime,可以与移动端原生进行通信
- 沙盒,限制调用原生api,比如文件网络等等
- 适配多个平台,比如安卓、ios等等
通信机制
- JSBridge(核心机制)
- 双向通信:调用原生功能、进行数据传递、触发回调函数
- webSockets
- 需要频繁更新的通道
- 建立长通信机制
JSBridge 实现原理
Native -> JS
解释性语言,拼接代码直接调用;
JS -> Native
- URL Schema Native可以直接通过解析url来获取数据,进行相关的操作;
sh
<protocol>://<host>/<path>?<qeury>#fragment
// 我们可以自定义JSBridge通信的URL Schema,比如:
hellobike://showToast?text=hello
java
// Android端
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("myapp://")) {
// 解析URL参数并执行相应操作
Uri uri = Uri.parse(url);
String action = uri.getHost();
String param = uri.getQueryParameter("param");
// 处理相应逻辑
return true; // 拦截URL
}
return super.shouldOverrideUrlLoading(view, url);
}
});
// JS端调用
location.href = "myapp://showToast?text=hello";
- 安卓平台的webview组件
@JavascriptInterface
也是通过“桥”
java
// Android端
class JsBridge {
@JavascriptInterface
public void showToast(String text) {
Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
}
webView.addJavascriptInterface(new JsBridge(), "NativeBridge");
// JS端调用
window.NativeBridge.showToast("hello");