ios 开发---h5与OC的交互
2018-01-12 本文已影响641人
wkw0913
如何实现点击h5 上的图片,实现参数传递给OC ?
我相信,许多人在开发中都会遇到这种情况,有的是遇到了OC 调用js,有的则是遇到了js调用OC,这种需求如今已经屡见不鲜,毕竟在某些情况下h5实现起来更加简便,好了不多说了,我在这里就简简单单的和大家举个js传值给OC的例子吧。
h5中有如下代码:
如果我们要实现点击h5上的图片,然后将图片所包含信息传给OC,我们该怎么做呢?首先,作为iOS 端,我们需要和h5端,商量传值的函数名(当然我这都是本地的h5,所以名称呢就不用去找h5商量了),记住函数名要一致,不能出错,否则的话,就没有效果喽,下面就是我们的例子了,首先是h5的实现方式,毕竟是从h5传给iOS 嘛
1.iOS 与h5商定好函数名,本例函数名已定:clickOnAndroid,h5端写法:
<a onclick="clickOnAndroid(1,2001,'平山森林公园')">
<img src="images/lh2001.jpg" /></a><br><span>平山森林公园</span>
说完了h5的实现方式,那么iOS端该怎么接受呢,此处,我们就在-(void)webViewDidFinishLoad:(UIWebView *)webView 函数中来接收,当然这是看情况的,并不是每一个都在这里接收的,此处不做详细说明。我们首先需要引入#import <JavaScriptCore/JavaScriptCore.h>头文件,使用系统的JSContext 获取传递过来的参数
各种数据类型可以转换,Objective-C的Block也可以传入JSContext中当做JavaScript的方法使用。以下,是我通过JSContext 获取参数的具体内容,大家主要看这一部分就行
__block NSArray *args;
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//定义好JS要调用的方法
context[@"clickOnAndroid"] = ^() {
webflag = YES;
args = [JSContext currentArguments];
dispatch_async(dispatch_get_main_queue(), ^{
JSValue *jsVal = args.lastObject;
JSValue *jsVal1 = args[args.count-2];
NSString *Id = jsVal1.toString;})
以下是我的一些需求,当然可能大家也会遇到类似的需求,这里就也分享出来,大家共享一下吧
2.OC 实现方式如下:
-(void)webViewDidFinishLoad:(UIWebView *)webView{
__block NSArray *args;
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//定义好JS要调用的方法
context[@"clickOnAndroid"] = ^() {
webflag = YES;
args = [JSContext currentArguments];
dispatch_async(dispatch_get_main_queue(), ^{
JSValue *jsVal = args.lastObject;
JSValue *jsVal1 = args[args.count-2];
NSString *Id = jsVal1.toString;
//以下为打开本地h5并传参的方式:
NSString *htmlstring = [[NSBundle mainBundle] pathForResource:@"kq_scenic" ofType:@"html" inDirectory:@"assets"];
NSString *htmS = [htmlstring stringByAppendingString:[NSString stringWithFormat:@"?areaId=%@",Id]];
NSLog(@"-------%@",Id);
//此处的url必须加上file:// (本地h5),否则无效果
NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"file://%@",[htmS stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSLog(@"%@",request);
[self.webView loadRequest:request];
});
};
}
//关闭网页复制粘贴功能
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
// Disable callout
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}