ios--网页js调用oc代码+传递参数+避免中文参数乱码的解决方案(实例)
此解决方案为本人测试可行的方案,欢迎转载,如需转载,请注明出处:http://blog.csdn.net/wanggsx918/article/details/20031257
此解决方案原理:
1、在ViewController.h中声明方法和成员变量,以及webView的委托:
// // ViewController.h // JS_IOS_01 // // Created by IMAC on 14-2-24. // Copyright (c) 2014年 Wanggsx. All rights reserved. // #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIWebViewDelegate> {} @property (nonatomic,retain) IBOutlet UIWebView *webView; // 两个参数 -(void)getParam1:(NSString*)str1 withParam2:(NSString*)str2; @end
2、在ViewController.m中合成成员变量并实现该方法:
// // ViewController.m // JS_IOS_01 // // Created by IMAC on 14-2-24. // Copyright (c) 2014年 Wanggsx. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize webView; - (void)viewDidLoad { [super viewDidLoad]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(void)getParam1:(NSString*)str1 withParam2:(NSString*)str2 { NSLog(@"收到html传过来的参数:str1=%@,str2=%@",str1,str2); } @end
3、在html页面中使用js代码调用该方法并传递2个参数(可以带中文),并使用button控件点击事件触发js方法。注意由于参数可能带有中文,故该html代码中应该有将中文转为utf-8的方法。html页面完整代码如下:
<html> <head> <meta content="text/html; charset=utf-8" http-equiv="content-type"> <title>js调用oc</title> <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> </head> <body> <p><input type="text" id="text1" value="我来自ios苹果"/></p> <p><input type="text" id="text2" value="我来自earth地球"/></p> <p><input type="button" id="enter" value="enter" onclick="testClick(‘getParam1:withParam2:‘);"/></p> </body> </html>4、在ViewController的viewDidLoad方法中加载该html网页:
- (void)viewDidLoad { [super viewDidLoad]; webView.backgroundColor = [UIColor clearColor]; //webView.scalesPageToFit =YES; webView.delegate =self; NSString *basePath = [[NSBundle mainBundle]bundlePath]; NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"jsIOS.html"]; NSURL *url = [NSURL fileURLWithPath:helpHtmlPath]; NSURLRequest *request=[NSURLRequest requestWithURL:url]; [webView loadRequest:request]; }
5、在ViewCotroller中重写WebView的委托方法shouldStartLoadWithRequest:navigationType:,并接收html网页传递过来的2个参数:
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { NSString *urlString = [[request URL] absoluteString]; urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"urlString=%@",urlString); NSArray *urlComps = [urlString componentsSeparatedByString:@"://"]; if([urlComps count] && [[urlComps objectAtIndex:0] isEqualToString:@"objc"]) { NSArray *arrFucnameAndParameter = [(NSString*)[urlComps objectAtIndex:1] componentsSeparatedByString:@":/"]; NSString *funcStr = [arrFucnameAndParameter objectAtIndex:0]; if (1 == [arrFucnameAndParameter count]) { // 没有参数 if([funcStr isEqualToString:@"doFunc1"]) { /*调用本地函数1*/ NSLog(@"doFunc1"); } } else { //有参数的 if([funcStr isEqualToString:@"getParam1:withParam2:"]) { [self getParam1:[arrFucnameAndParameter objectAtIndex:1] withParam2:[arrFucnameAndParameter objectAtIndex:2]]; } } return NO; } return TRUE; }
6、运行项目,点击网页中的按钮,即可实现html调用并传递参数给OC代码。
以下是完整的ViewController.m的代码:
// // ViewController.m // JS_IOS_01 // // Created by IMAC on 14-2-24. // Copyright (c) 2014年 Wanggsx. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize webView; - (void)viewDidLoad { [super viewDidLoad]; webView.backgroundColor = [UIColor clearColor]; //webView.scalesPageToFit =YES; webView.delegate =self; NSString *basePath = [[NSBundle mainBundle]bundlePath]; NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"jsIOS.html"]; NSURL *url = [NSURL fileURLWithPath:helpHtmlPath]; NSURLRequest *request=[NSURLRequest requestWithURL:url]; [webView loadRequest:request]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { NSString *urlString = [[request URL] absoluteString]; urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"urlString=%@",urlString); NSArray *urlComps = [urlString componentsSeparatedByString:@"://"]; if([urlComps count] && [[urlComps objectAtIndex:0] isEqualToString:@"objc"]) { NSArray *arrFucnameAndParameter = [(NSString*)[urlComps objectAtIndex:1] componentsSeparatedByString:@":/"]; NSString *funcStr = [arrFucnameAndParameter objectAtIndex:0]; if (1 == [arrFucnameAndParameter count]) { // 没有参数 if([funcStr isEqualToString:@"doFunc1"]) { /*调用本地函数1*/ NSLog(@"doFunc1"); } } else { //有参数的 if([funcStr isEqualToString:@"getParam1:withParam2:"]) { [self getParam1:[arrFucnameAndParameter objectAtIndex:1] withParam2:[arrFucnameAndParameter objectAtIndex:2]]; } } return NO; } return TRUE; } -(void)getParam1:(NSString*)str1 withParam2:(NSString*)str2 { NSLog(@"收到html传过来的参数:str1=%@,str2=%@",str1,str2); } @end
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。