您的位置:首页 > 移动开发 > IOS开发

ios--网页js调用oc代码+传递参数+避免中文参数乱码的解决方案(实例)

2017-09-21 13:06 946 查看
转自:http://blog.csdn.net/zhangkongzhongyun/article/details/24313845

此解决方案原理:

1、在ViewController.h中声明方法和成员变量,以及webView的委托:

?
2、在ViewController.m中合成成员变量并实现该方法:

?
3、在html页面中使用js代码调用该方法并传递2个参数(可以带中文),并使用button控件点击事件触发js方法。注意由于参数可能带有中文,故该html代码中应该有将中文转为utf-8的方法。html页面完整代码如下:

?
<script type=text/javaScript> function testClick(cmd) { //var str1 = ducument.getElementById(text1).value; //var str2 = ducument.getElementById(text2).value; var str1=document.getElementById(text1).value;
var str2=document.getElementById(text2).value; //var str1=我来自ios苹果; //%25u6211%25u6765%25u81EAios%25u82F9%25u679C //var str2=我来自earth地球;//%25u6211%25u6765%25u81EAearth%25u5730%25u7403 document.write(Date()); window.location.href=objc://+cmd+:/+EncodeUtf8(str1)+:/+EncodeUtf8(str2);
} // 字符串转换utf-8 function EncodeUtf8(s1) { // escape函数用于对除英文字母外的字符进行编码。如“Visit W3School!”->Visit%20W3School%21 var s = escape(s1); var sa = s.split(%);//sa[1]=u6211 var retV =; if(sa[0] != ) { retV = sa[0]; } for(var i = 1; i < sa.length; i ++) { if(sa[i].substring(0,1)
== u) { retV += Hex2Utf8(Str2Hex(sa[i].substring(1,5))); if(sa[i].length>=6) { retV += sa[i].substring(5); } } else retV += % + sa[i]; } return retV; } function Str2Hex(s) { var c = ; var n; var ss = 0123456789ABCDEF; var digS = ; for(var i = 0; i < s.length;
i ++) { c = s.charAt(i); n = ss.indexOf(c); digS += Dec2Dig(eval(n)); } //return value; return digS; } function Dec2Dig(n1) { var s = ; var n2 = 0; for(var i = 0; i < 4; i++) { n2 = Math.pow(2,3 - i); if(n1 >= n2) { s += '1'; n1 = n1 - n2; } else s += '0';
} return s; } function Dig2Dec(s) { var retV = 0; if(s.length == 4) { for(var i = 0; i < 4; i ++) { retV += eval(s.charAt(i)) * Math.pow(2, 3 - i); } return retV; } return -1; } function Hex2Utf8(s) { var retS = ; var tempS = ; var ss = ; if(s.length == 16)
{ tempS = 1110 + s.substring(0, 4); tempS += 10 + s.substring(4, 10); tempS += 10 + s.substring(10,16); var sss = 0123456789ABCDEF; for(var i = 0; i < 3; i ++) { retS += %; ss = tempS.substring(i * 8, (eval(i)+1)*8); retS += sss.charAt(Dig2Dec(ss.substring(0,4)));
retS += sss.charAt(Dig2Dec(ss.substring(4,8))); } return retS; } return ; } </script>

4、在ViewController的viewDidLoad方法中加载该html网页:

?
5、在ViewCotroller中重写WebView的委托方法shouldStartLoadWithRequest:navigationType:,并接收html网页传递过来的2个参数:

?
6、运行项目,点击网页中的按钮,即可实现html调用并传递参数给OC代码。

以下是完整的ViewController.m的代码:

?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐