记得之前写过一个Android WebView与JavaScript交互的文章,记得当时写完还是一阵激动的,完成了老大的交付的任务,就可以~呵呵呵~了,今天一不小心看到了一篇文章中提到用addJavascriptInterface()方法在Android 4.2以前的设备上并不能安全的访问,具体请参见Android WebView的Js对象注入漏洞解决方案这篇博客,里面详细介绍了如何出现漏洞以及漏洞的解决方案。很不幸,我们的应用要兼容到4.0的版本,所以需要一个解决方案来解决4.2以前不安全的问题,上述博客中讲到的解决方案有点繁琐,像我等懒货只能另寻它法了。终于让我找到了一个较简便的方案来完成这个功能。具体请参拜为WebView中的Java与JavaScript提供【安全可靠】的多样互通方案。
- 下面进入使用环节:
首先,要添加项目依赖,这样我们才能使用大牛完成的功能。
Maven
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>cn.pedant.safewebviewbridge</groupId>
<artifactId>library</artifactId>
<version>1.4</version>
<type>aar</type>
</dependency>
Gradle
dependencies {
compile 'cn.pedant.safewebviewbridge:library:1.4'
}
等项目依赖添加完成后就可以快乐的使用大牛开发的功能了。
主要的WebView一些设置问题已经在Android WebView与JavaScript交互一文中有了详细的介绍,有需要的淫可以去看看,我们直接进入safe-java-js-webview-bridge使用环节。
新建一个class文件,名为HostJsScope.java,里面的方法全部定义为public静态方法,且必须包含WebView这个参数,请见下面的代码片段:
public static void toastMessage(WebView webView, String message) {
Toast.makeText(webView.getContext(), message, Toast.LENGTH_LONG).show();
}
方法中只是简单的调用了Android的Toast的提示功能,在看看如何调用。
<input type="button" onclick="toastMessage('渠道发生')" value="测试JavaJsBridge"/>
在as.html中定义一个按钮,点击调用as.js中的方法toastMessae()方法,接下来看看toastMessae()方法的具体内容:
function toastMessage(message) {
window.HostApp.toastMessage(ss)
}
没错,就是这么简单,你就可以方便的在WebView中调用Android中原生的方法了。哦,忘了说了,需要在Activity中关联到HostJsScope,具体代码:
wvBridge.setWebChromeClient(
new InjectedChromeClient("HostApp", HostJsScope.class)
);
是的,你没有看错,就是这么简单的一句就可以安全与JavaScript交互了。
好了,大致的内容也就这么多了,如果有朋友有更好的见解或者上述内容中出现有误之处,请悄悄指出,反正我也不会改,不要憋坏了自己哟!
最后,献上源码:传送门