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

    此解决方案原理:

    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  
  • 相关阅读:
    关于java.lang.OutOfMemoryError: Java heap space的错误分析
    对TCP/IP网络协议的深入浅出归纳
    leetcode面试准备:Contains Duplicate I && II
    leetcode面试准备:Count Complete Tree Nodes
    leetcode面试准备: Jump Game II
    leetcode面试准备: Jump Game
    LeetCode解题报告:Linked List Cycle && Linked List Cycle II
    最小栈的实现与优化
    面试:归并排序
    leetcode面试准备:Decode Ways
  • 原文地址:https://www.cnblogs.com/ios8/p/ios-js-oc.html
Copyright © 2011-2022 走看看