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

来源:互联网 发布:早产儿生长曲线图软件 编辑:程序博客网 时间:2024/04/20 16:31

此解决方案为本人测试可行的方案,欢迎转载,如需转载,请注明出处: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


0 0
原创粉丝点击