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. #import <UIKit/UIKit.h>
  9. @interface ViewController : UIViewController<UIWebViewDelegate>
  10. {}
  11. @property (nonatomic,retain) IBOutlet UIWebView *webView;
  12. // 两个参数
  13. -(void)getParam1:(NSString*)str1 withParam2:(NSString*)str2;
  14. @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. #import "ViewController.h"
  9. @interface ViewController ()
  10. @end
  11. @implementation ViewController
  12. @synthesize webView;
  13. - (void)viewDidLoad
  14. {
  15. [super viewDidLoad];
  16. }
  17. - (void)didReceiveMemoryWarning
  18. {
  19. [super didReceiveMemoryWarning];
  20. // Dispose of any resources that can be recreated.
  21. }
  22. -(void)getParam1:(NSString*)str1 withParam2:(NSString*)str2
  23. {
  24. NSLog(@"收到html传过来的参数:str1=%@,str2=%@",str1,str2);
  25. }
  26. @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. // 字符串转换utf-8
  18. function EncodeUtf8(s1)
  19. {
  20. // escape函数用于对除英文字母外的字符进行编码。如“Visit W3School!”->"Visit%20W3School%21"
  21. var s = escape(s1);
  22. var sa = s.split("%");//sa[1]=u6211
  23. var retV ="";
  24. if(sa[0] != "")
  25. {
  26. retV = sa[0];
  27. }
  28. for(var i = 1; i < sa.length; i ++)
  29. {
  30. if(sa[i].substring(0,1) == "u")
  31. {
  32. retV += Hex2Utf8(Str2Hex(sa[i].substring(1,5)));
  33. if(sa[i].length>=6)
  34. {
  35. retV += sa[i].substring(5);
  36. }
  37. }
  38. else retV += "%" + sa[i];
  39. }
  40. return retV;
  41. }
  42. function Str2Hex(s)
  43. {
  44. var c = "";
  45. var n;
  46. var ss = "0123456789ABCDEF";
  47. var digS = "";
  48. for(var i = 0; i < s.length; i ++)
  49. {
  50. c = s.charAt(i);
  51. n = ss.indexOf(c);
  52. digS += Dec2Dig(eval(n));
  53. }
  54. //return value;
  55. return digS;
  56. }
  57. function Dec2Dig(n1)
  58. {
  59. var s = "";
  60. var n2 = 0;
  61. for(var i = 0; i < 4; i++)
  62. {
  63. n2 = Math.pow(2,3 - i);
  64. if(n1 >= n2)
  65. {
  66. s += '1';
  67. n1 = n1 - n2;
  68. }
  69. else
  70. s += '0';
  71. }
  72. return s;
  73. }
  74. function Dig2Dec(s)
  75. {
  76. var retV = 0;
  77. if(s.length == 4)
  78. {
  79. for(var i = 0; i < 4; i ++)
  80. {
  81. retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
  82. }
  83. return retV;
  84. }
  85. return -1;
  86. }
  87. function Hex2Utf8(s)
  88. {
  89. var retS = "";
  90. var tempS = "";
  91. var ss = "";
  92. if(s.length == 16)
  93. {
  94. tempS = "1110" + s.substring(0, 4);
  95. tempS += "10" +  s.substring(4, 10);
  96. tempS += "10" + s.substring(10,16);
  97. var sss = "0123456789ABCDEF";
  98. for(var i = 0; i < 3; i ++)
  99. {
  100. retS += "%";
  101. ss = tempS.substring(i * 8, (eval(i)+1)*8);
  102. retS += sss.charAt(Dig2Dec(ss.substring(0,4)));
  103. retS += sss.charAt(Dig2Dec(ss.substring(4,8)));
  104. }
  105. return retS;
  106. }
  107. return "";
  108. }
  109. </script>
  110. </head>
  111. <body>
  112. <p><input type="text" id="text1" value="我来自ios苹果"/></p>
  113. <p><input type="text" id="text2" value="我来自earth地球"/></p>
  114. <p><input type="button" id="enter" value="enter" onclick="testClick('getParam1:withParam2:');"/></p>
  115. </body>
  116. </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. if([urlComps count] && [[urlComps objectAtIndex:0] isEqualToString:@"objc"])
  8. {
  9. NSArray *arrFucnameAndParameter = [(NSString*)[urlComps objectAtIndex:1] componentsSeparatedByString:@":/"];
  10. NSString *funcStr = [arrFucnameAndParameter objectAtIndex:0];
  11. if (1 == [arrFucnameAndParameter count])
  12. {
  13. // 没有参数
  14. if([funcStr isEqualToString:@"doFunc1"])
  15. {
  16. /*调用本地函数1*/
  17. NSLog(@"doFunc1");
  18. }
  19. }
  20. else
  21. {
  22. //有参数的
  23. if([funcStr isEqualToString:@"getParam1:withParam2:"])
  24. {
  25. [self getParam1:[arrFucnameAndParameter objectAtIndex:1] withParam2:[arrFucnameAndParameter objectAtIndex:2]];
  26. }
  27. }
  28. return NO;
  29. }
  30. return TRUE;
  31. }

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. #import "ViewController.h"
    9. @interface ViewController ()
    10. @end
    11. @implementation ViewController
    12. @synthesize webView;
    13. - (void)viewDidLoad
    14. {
    15. [super viewDidLoad];
    16. webView.backgroundColor = [UIColor clearColor];
    17. //webView.scalesPageToFit =YES;
    18. webView.delegate =self;
    19. NSString *basePath = [[NSBundle mainBundle]bundlePath];
    20. NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"jsIOS.html"];
    21. NSURL *url = [NSURL fileURLWithPath:helpHtmlPath];
    22. NSURLRequest *request=[NSURLRequest requestWithURL:url];
    23. [webView loadRequest:request];
    24. }
    25. - (void)didReceiveMemoryWarning
    26. {
    27. [super didReceiveMemoryWarning];
    28. // Dispose of any resources that can be recreated.
    29. }
    30. - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
    31. {
    32. NSString *urlString = [[request URL] absoluteString];
    33. urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    34. NSLog(@"urlString=%@",urlString);
    35. NSArray *urlComps = [urlString componentsSeparatedByString:@"://"];
    36. if([urlComps count] && [[urlComps objectAtIndex:0] isEqualToString:@"objc"])
    37. {
    38. NSArray *arrFucnameAndParameter = [(NSString*)[urlComps objectAtIndex:1] componentsSeparatedByString:@":/"];
    39. NSString *funcStr = [arrFucnameAndParameter objectAtIndex:0];
    40. if (1 == [arrFucnameAndParameter count])
    41. {
    42. // 没有参数
    43. if([funcStr isEqualToString:@"doFunc1"])
    44. {
    45. /*调用本地函数1*/
    46. NSLog(@"doFunc1");
    47. }
    48. }
    49. else
    50. {
    51. //有参数的
    52. if([funcStr isEqualToString:@"getParam1:withParam2:"])
    53. {
    54. [self getParam1:[arrFucnameAndParameter objectAtIndex:1] withParam2:[arrFucnameAndParameter objectAtIndex:2]];
    55. }
    56. }
    57. return NO;
    58. }
    59. return TRUE;
    60. }
    61. -(void)getParam1:(NSString*)str1 withParam2:(NSString*)str2
    62. {
    63. NSLog(@"收到html传过来的参数:str1=%@,str2=%@",str1,str2);
    64. }
    65. @end
上一篇:Python装饰器几个有用又好玩的例子


下一篇:51nod1119 机器人走方格 V2