最近写了一个webview用来加载HTML, 需求是在HTML中有一个分享按钮, 点击按钮之后调用友盟的微信分享,
因为分享功能是集成在Android项目中, 所以就需要用到Android和js交互, 于是就使用了:
wv.addJavascriptInterface(this, "android_share");
的回调方式与自定义的
@JavascriptInterface
public void share() {
wv.post(new Runnable() {
@Override
public void run() {
// 微信分享
}
});
}
应用在未打包时可以看到点击按钮是会执行分享方法的, 只不过会执行失败, 这是因为友盟的微信分享必须要打包之后才能顺利分享
于是就准备打包测试, 但是当打包应用之后再点击按钮就没有任何反应了, 所以考虑应该不是代码的问题 但也不知道问题出在哪里
然后就开始在网上找相关资料, 大多数都是说的一个基本配置:
wv.getSettings().setJavaScriptEnabled(true);
然而这并不能解决我的问题, 因为我已经配置过了, 于是继续找, 找了好久终于找到一个靠谱的帖子:
https://blog.csdn.net/chenjiang2936/article/details/79346778
其实原因就在于我之前提到的打包, 相信大多数项目在上线之前都会做混淆, 因为混淆会提高一点项目的安全性但同时也会产生一些令人头疼的问题
在混淆配置文件中有一段描述如下:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
就是说如果项目中有用到webview并且使用了js交互 就需要取消下面的注释并指定你的类的全名, 实际操作如下:
把上面描述中的最下面3行注释解除, 并把 fqcn.of.javascript.interface.for.webview 换成你的类的全名, 然后在加上配置:
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
最后效果就是:
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
-keepclassmembers class 你的类的全名 {
public *;
}
然后在打包测试, 最终问题解决