原生调用Web端代码
WebView是Native中加载网页的一个控件,该组件提供一个evaluateJavascript()办法运行JS代码。咱们要做的是在Native端执行一个js办法,在Web端进行监听。
Web端定义方法
window.doit=function(data){ console.log(data);};
原生调用
webView.evaluateJavascript("window.doit('来自原生的数据')", null);
Web端调用原生代码
当Web端要申请Native端的办法时,咱们首先要自定义一个URL Schema,向Native端发动一个申请,最初在Native端的WebView进行监听。
URL schema介绍
URL schema 是类URL的申请格局,如:<protocol>://<domain>/<path>?<query>
Web端发送URL schema申请
比方咱们能够通过批改一个暗藏的iframe地址来实现发送申请:
<iframe src="jsbridge://showToast?text=来自Web端端数据"></iframe>
舒适提醒:失常来说是能够通过window.location.href达到发动网络申请的成果的,然而有一个很重大的问题,就是如果咱们间断屡次批改window.location.href的值,在Native层只能接管到最初一次申请,后面的申请都会被疏忽掉。所以JS端发动网络申请的时候,须要应用iframe,这样就能够防止这个问题。
原生实现监听
安卓
在Android中(WebViewClient里),通过shouldoverrideurlloading能够捕捉到url scheme的触发:
private WebViewClient webViewClient = new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url){ //读取到url后自行进行剖析解决 //如果返回false,则WebView解决链接url,如果返回true,代表WebView依据程序来执行url return true; }}
舒适提醒:另外,Web中也能够不通过iframe.src来触发scheme,通过window.prompt(uri, "");来触发scheme,而后原生中通过重写WebViewClient的onJsPrompt来获取uri。