ios--网页js调用oc代码+传递参数+避免中文参数乱码的解决方案(实例)
2024-10-15 08:26:36
此解决方案原理:
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
最新文章
- 【腾讯Bugly干货分享】基于 Webpack &; Vue &; Vue-Router 的 SPA 初体验
- powershell
- 示例在同一台机器上使用RMAN克隆数据库
- Jenkins学习八:Jenkins语言本地化
- Oracle中的伪列
- 使用repeater实现gridview的功能
- HTML之一 符号实体
- 【M12】了解“抛出一个exception”与“传递一个参数”或“调用一个虚函数”之间的差异
- Mysql查询高速缓存区
- openstack-glance API 镜像管理的部分实现和样例
- .net面式题
- delphi 把数据库图片的存取
- easyui datagrid 三层嵌套
- 最重要的7个Drupal内核模板文件
- Echarts运用
- c# 调取 c++ dll____c#调用dll
- Oracle ORA-12541:TNS:no listener错误解决方法 (转)
- 关于httpclient的终结
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A、Saving Tang Monk II 【状态搜索】
- [加入用户]解决useradd 用户后没有加入用户Home文件夹的情况,Linux改变文件或文件夹的訪问权限命令,linux改动用户password,usermod的ysuum安装包。飞
热门文章
- cocos2d-js 各浏览器上的表现
- 【Java】监控远程服务器JVM
- V-rep学习笔记:并联机构正逆运动学
- Generating phar.phar chmod: cannot access `ext/phar/phar.phar&#39;: No such file or directory make: [ext/phar/phar.phar] Error 1 (ignored)
- linux 常见音乐、视频播放器简介
- 关于UDP-读这篇就够了(疑难杂症和使用)
- Swift3 文件操作常用方法汇总
- 开发 Swift 和 Objective-C 混编的 Framework
- 利用Apache配置http expires值提高网站性能
- Android之listview运用(美团美食列表)