WebView中js交互时参数中含特殊字符及乱码的问题
使用WebView一般会用到js交互,无非两种:1.后台调用客户端的方法(客户端写方法并使用@JavaScript注解改方法即可);2.客户端调用后台的方法(webView.loadUrl(“javascript:(’ “+param1+” ‘,’ “+param2+” ‘)”))。都比较简单。但是最近我觉在js交互上踩了2个大坑。特此记录。
js方法中的参数含有特殊字符
问题描述
特殊字符就是在参数中含有*,例如:\n,\t,\r等已 \ 开头的字符,我遇到的问题就客户端调用后台的方法,把json字符串参数传给后台,但是json字符串参数中含有\n换行符,后台在解析json的时候会有异常。百度得知,javascript在解析json的时候遇到特殊字符会先进行转义,导致报错。JSON.parse 解析json字符串时,遇换行符报错
解决方案
既然知道了错误原因,那解决方案也很简单,直接将字符串中的特殊字符去掉或者转义
String str = "哈哈哈\n嘻嘻嘻\n哈哈";
str.replace("\n","\\n");
或者
String str = "哈哈哈\n嘻嘻嘻\n哈哈";
str.replaceAll("\\\\n","");
js参数中含有乱码
问题描述
这也是我碰到的比较奇葩的一个问题。在客户端调用webView.loadUrl(“javascript:(’ “param1” ‘)”)方法回调后台的方法时,param1中含有乱码,导致调用js失败(这个问题但是我们还有一点争议,我说我打断点跟踪,调用js的代码触发了啊,而且没有异常,但是后台的同事就是说他那边没有调起来,最后打log日志发现参数中有乱码,难道真是因为乱码导致js调用失败?将乱码的字符串换成普通字符串,一切ok,原来真是乱码的问题。又长见识了有木有)。因为牵涉到第三方应用,所以乱码的问题不可避免。
解决方案
原来webView.loadUrl(“javascript:(…)”)方法注入js时会先进行解码,因为参数中有乱码问题,所以导致解码异常,注入js失败。
在Android4.4之后有另一种注入js的方案:mWebView.evaluateJavascript(“javascript:(…)”);采用这种方案不会先进行解码,直接注入。Google也推荐4.4以上使用该方法进行js注入。通过这种方法成功解决上述问题。Android WebView注入js中带有URL-encode字符时报错问题
小结
这算是我碰到的两个比较奇葩的问题吧,看似简单,但又不容易定位。再次记录,希望可以帮到其他童鞋。