·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> ios--网页js调用oc代码+传递参数+避免中文参数乱码的解决方案(实例)

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

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

此解决方案原理:

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

  1. //  
  2. //  ViewController.h  
  3. //  JS_IOS_01  
  4. //  
  5. //  Created by IMAC on 14-2-24.  
  6. //  Copyright (c) 2014年 Wanggsx. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10.   
  11. @interface ViewController : UIViewController<UIWebViewDelegate>  
  12. {}  
  13. @PRoperty (nonatomic,retain) IBOutlet UIWebView *webView;  
  14. // 两个参数  
  15. -(void)getParam1:(NSString*)str1 withParam2:(NSString*)str2;  
  16. @end  

 

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

  1. //  
  2. //  ViewController.m  
  3. //  JS_IOS_01  
  4. //  
  5. //  Created by IMAC on 14-2-24.  
  6. //  Copyright (c) 2014年 Wanggsx. All rights reserved.  
  7. //  
  8.   
  9. #import "ViewController.h"  
  10.   
  11. @interface ViewController ()  
  12.   
  13. @end  
  14.   
  15. @implementation ViewController  
  16. @synthesize webView;  
  17. - (void)viewDidLoad  
  18. {  
  19.     [super viewDidLoad];  
  20. }  
  21.   
  22. - (void)didReceiveMemoryWarning  
  23. {  
  24.     [super didReceiveMemoryWarning];  
  25.     // Dispose of any resources that can be recreated.  
  26. }  
  27.   
  28. -(void)getParam1:(NSString*)str1 withParam2:(NSString*)str2  
  29. {  
  30.         NSLog(@"收到html传过来的参数:str1=%@,str2=%@",str1,str2);  
  31. }  
  32. @end  


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

  1. <html>  
  2.     <head>  
  3.         <meta content="text/html; charset=utf-8" http-equiv="content-type">  
  4.         <title>js调用oc</title>  
  5.         <script type="text/javaScript">  
  6.             function testClick(cmd)  
  7.             {  
  8.                 //var str1 = ducument.getElementById("text1").value;  
  9.                 //var str2 = ducument.getElementById("text2").value;  
  10.                 var str1=document.getElementById("text1").value;  
  11.                 var str2=document.getElementById("text2").value;  
  12.                 //var str1="我来自ios苹果"; //%25u6211%25u6765%25u81EAios%25u82F9%25u679C  
  13.                 //var str2="我来自earth地球";//%25u6211%25u6765%25u81EAearth%25u5730%25u7403  
  14.                 document.write(Date());  
  15.                 window.location.href="objc://"+cmd+":/"+EncodeUtf8(str1)+":/"+EncodeUtf8(str2);  
  16.             }  
  17.           
  18.             // 字符串转换utf-8  
  19.             function EncodeUtf8(s1)  
  20.             {  
  21.                 // escape函数用于对除英文字母外的字符进行编码。如“Visit W3School!”->"Visit%20W3School%21"  
  22.                 var s = escape(s1);  
  23.                 var sa = s.split("%");//sa[1]=u6211  
  24.                 var retV ="";  
  25.                 if(sa[0] != "")  
  26.                 {  
  27.                     retV = sa[0];  
  28.                 }  
  29.                 for(var i = 1; i < sa.length; i ++)  
  30.                 {  
  31.                     if(sa[i].substring(0,1) == "u")  
  32.                     {  
  33.                         retV += Hex2Utf8(Str2Hex(sa[i].substring(1,5)));  
  34.                         if(sa[i].length>=6)  
  35.                         {  
  36.                             retV += sa[i].substring(5);  
  37.                         }  
  38.                     }  
  39.                     else retV += "%" + sa[i];  
  40.                 }  
  41.                 return retV;  
  42.             }  
  43.             function Str2Hex(s)  
  44.             {  
  45.                 var c = "";  
  46.                 var n;  
  47.                 var ss = "0123456789ABCDEF";  
  48.                 var digS = "";  
  49.                 for(var i = 0; i < s.length; i ++)  
  50.                 {  
  51.                     c = s.charAt(i);  
  52.                     n = ss.indexOf(c);  
  53.                     digS += Dec2Dig(eval(n));  
  54.                       
  55.                 }  
  56.                 //return value;  
  57.                 return digS;  
  58.             }  
  59.             function Dec2Dig(n1)  
  60.             {  
  61.                 var s = "";  
  62.                 var n2 = 0;  
  63.                 for(var i = 0; i < 4; i++)  
  64.                 {  
  65.                     n2 = Math.pow(2,3 - i);  
  66.                     if(n1 >= n2)  
  67.                     {  
  68.                         s += '1';  
  69.                         n1 = n1 - n2;  
  70.                     }  
  71.                     else  
  72.                     s += '0';  
  73.                       
  74.                 }  
  75.                 return s;  
  76.                   
  77.             }  
  78.             function Dig2Dec(s)  
  79.             {  
  80.                 var retV = 0;  
  81.                 if(s.length == 4)  
  82.                 {  
  83.                     for(var i = 0; i < 4; i ++)  
  84.                     {  
  85.                         retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);  
  86.                     }  
  87.                     return retV;  
  88.                 }  
  89.                 return -1;  
  90.             }  
  91.             function Hex2Utf8(s)  
  92.             {  
  93.                 var retS = "";  
  94.                 var tempS = "";  
  95.                 var ss = "";  
  96.                 if(s.length == 16)  
  97.                 {  
  98.                     tempS = "1110" + s.substring(0, 4);  
  99.                     tempS += "10" +  s.substring(4, 10);  
  100.                     tempS += "10" + s.substring(10,16);   
  101.                     var sss = "0123456789ABCDEF";   
  102.                     for(var i = 0; i < 3; i ++)   
  103.                     {   
  104.                         retS += "%";   
  105.                         ss = tempS.substring(i * 8, (eval(i)+1)*8);   
  106.                           
  107.                           
  108.                           
  109.                         retS += sss.charAt(Dig2Dec(ss.substring(0,4)));   
  110.                         retS += sss.charAt(Dig2Dec(ss.substring(4,8)));   
  111.                     }   
  112.                     return retS;   
  113.                 }   
  114.                 return "";   
  115.             }  
  116.         </script>  
  117.     </head>  
  118.     <body>  
  119.         <p><input type="text" id="text1" value="我来自ios苹果"/></p>  
  120.         <p><input type="text" id="text2" value="我来自earth地球"/></p>  
  121.       <p><input type="button" id="enter" value="enter" onclick="testClick('getParam1:withParam2:');"/></p>  
  122.     </body>  
  123. </html>  

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

  

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     webView.backgroundColor = [UIColor clearColor];  
  5.     //webView.scalesPageToFit =YES;  
  6.     webView.delegate =self;  
  7.     NSString *basePath = [[NSBundle mainBundle]bundlePath];  
  8.     NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"jsIOS.html"];  
  9.     NSURL *url = [NSURL fileURLWithPath:helpHtmlPath];  
  10.     NSURLRequest *request=[NSURLRequest requestWithURL:url];  
  11.     [webView loadRequest:request];  
  12. }  


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

  

  1. - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType  
  2. {  
  3.     NSString *urlString = [[request URL] absoluteString];  
  4.     urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  5.     NSLog(@"urlString=%@",urlString);  
  6.     NSArray *urlComps = [urlString componentsSeparatedByString:@"://"];  
  7.       
  8.     if([urlComps count] && [[urlComps objectAtIndex:0] isEqualToString:@"objc"])  
  9.     {  
  10.           
  11.         NSArray *arrFucnameAndParameter = [(NSString*)[urlComps objectAtIndex:1] componentsSeparatedByString:@":/"];  
  12.         NSString *funcStr = [arrFucnameAndParameter objectAtIndex:0];  
  13.           
  14.         if (1 == [arrFucnameAndParameter count])  
  15.         {  
  16.             // 没有参数  
  17.             if([funcStr isEqualToString:@"doFunc1"])  
  18.             {  
  19.                   
  20.                 /*调用本地函数1*/  
  21.                 NSLog(@"doFunc1");  
  22.                   
  23.             }  
  24.         }  
  25.         else  
  26.         {  
  27.             //有参数的  
  28.             if([funcStr isEqualToString:@"getParam1:withParam2:"])  
  29.             {  
  30.                 [self getParam1:[arrFucnameAndParameter objectAtIndex:1] withParam2:[arrFucnameAndParameter objectAtIndex:2]];  
  31.             }  
  32.         }  
  33.         return NO;  
  34.     }  
  35.     return TRUE;  
  36. }  


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

 

 

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

  

    1. //  
    2. //  ViewController.m  
    3. //  JS_IOS_01  
    4. //  
    5. //  Created by IMAC on 14-2-24.  
    6. //  Copyright (c) 2014年 Wanggsx. All rights reserved.  
    7. //  
    8.   
    9. #import "ViewController.h"  
    10.   
    11. @interface ViewController ()  
    12.   
    13. @end  
    14.   
    15. @implementation ViewController  
    16. @synthesize webView;  
    17. - (void)viewDidLoad  
    18. {  
    19.     [super viewDidLoad];  
    20.     webView.backgroundColor = [UIColor clearColor];  
    21.     //webView.scalesPageToFit =YES;  
    22.     webView.delegate =self;  
    23.     NSString *basePath = [[NSBundle mainBundle]bundlePath];  
    24.     NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"jsIOS.html"];  
    25.     NSURL *url = [NSURL fileURLWithPath:helpHtmlPath];  
    26.     NSURLRequest *request=[NSURLRequest requestWithURL:url];  
    27.     [webView loadRequest:request];  
    28. }  
    29.   
    30. - (void)didReceiveMemoryWarning  
    31. {  
    32.     [super didReceiveMemoryWarning];  
    33.     // Dispose of any resources that can be recreated.  
    34. }  
    35.   
    36. - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType  
    37. {  
    38.     NSString *urlString = [[request URL] absoluteString];  
    39.     urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
    40.     NSLog(@"urlString=%@",urlString);  
    41.     NSArray *urlComps = [urlString componentsSeparatedByString:@"://"];  
    42.       
    43.     if([urlComps count] && [[urlComps objectAtIndex:0] isEqualToString:@"objc"])  
    44.     {  
    45.           
    46.         NSArray *arrFucnameAndParameter = [(NSString*)[urlComps objectAtIndex:1] componentsSeparatedByString:@":/"];  
    47.         NSString *funcStr = [arrFucnameAndParameter objectAtIndex:0];  
    48.           
    49.         if (1 == [arrFucnameAndParameter count])  
    50.         {  
    51.             // 没有参数  
    52.             if([funcStr isEqualToString:@"doFunc1"])  
    53.             {  
    54.                   
    55.                 /*调用本地函数1*/  
    56.                 NSLog(@"doFunc1");  
    57.                   
    58.             }  
    59.         }  
    60.         else  
    61.         {  
    62.             //有参数的  
    63.             if([funcStr isEqualToString:@"getParam1:withParam2:"])  
    64.             {  
    65.                 [self getParam1:[arrFucnameAndParameter objectAtIndex:1] withParam2:[arrFucnameAndParameter objectAtIndex:2]];  
    66.             }  
    67.         }  
    68.         return NO;  
    69.     }  
    70.     return TRUE;  
    71. }  
    72.   
    73. -(void)getParam1:(NSString*)str1 withParam2:(NSString*)str2  
    74. {  
    75.         NSLog(@"收到html传过来的参数:str1=%@,str2=%@",str1,str2);  
    76. }  
    77. @end