OC和JS交互

一、说明

这篇文章记录自己在研究OC与JS交互中的所得,以及遇到的问题与解决

由于苹果的审核时间太漫长,一次审核不过,那又将进入另一个漫长的审核期。为了能在开发中方便更新,公司要求在项目中使用HTML5,这样就涉及到OC与JS的交互,不懂H5,不懂JS。在经过一段时间的摸索之后,将自己的研究记录下来,以做备忘。

OC与JS的交互实现方式有很多,之前用的比较多的是WebViewJavaScriptBridge,但在IOS7之后,苹果将JavaScriptCore框架开放。因此,这篇文章不讲理论,主要讲的是JavaScriptCore的实际使用。

废话说完了,下面进入正题

二、Demo项目中功能介绍

Demo首页

这个demo主要分为了三个部分来:

1.JS Call OC , JS调用OC的函数

2.OC Call JS , OC调用JS的函数

3.一个绘图的例子

在做OC与JS交互工作之前,我们需要做些准备工作

1.导入JavaScriptCore的头文件

```

 #import

```

2.用webView加载HTML文件,这里用的是本地HTML;

- (void)viewDidLoad{[superviewDidLoad];// Do any additional setup after loading the view from its nib.self.title =@"js call oc";NSString*path = [[[NSBundlemainBundle] bundlePath]  stringByAppendingPathComponent:@"JSCallOC.html"];NSURLRequest*request = [NSURLRequestrequestWithURL:[NSURLfileURLWithPath:path]];[self.webView loadRequest:request];}

3.在JS交互中,很多事情都是在webView的delegate方法中完成的,通过JSContent创建一个使用JS的环境,所以这里,我们先将self.content在这里面初始化;

- (void)webViewDidFinishLoad:(UIWebView*)webView{//初始化contentself.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];// 打印异常,由于JS的异常信息是不会在OC中被直接打印的,所以我们在这里添加打印异常信息,self.context.exceptionHandler =^(JSContext *context, JSValue *exceptionValue){    context.exception = exceptionValue;NSLog(@"%@", exceptionValue);};}

三、实际操作中 JS call OC

先来看demo

JS Call OC

这个页面整个都是通过HTML实现的,

1 计算阶乘:在输入框中输入一个数字,然后在OC中计算出结果,最后显示在HTML的页面上;

2 测试log:点击后,在后台打印测试数据;

3 OC原生Alert :点击后,弹出OC的提示框;

4 addSubView:点击后,在OC中添加一个View;

5 push to second ViewController :跳转到下一个界面

总结:以上功能都是在OC获取HTML中按钮的点击事件,在后在OC中实现功能

??如何获取HTML中的点击事件呢??

在HTML中,为一个元素添加点击时间有两种写法

或者

如果是第一种方法,

那么就要用JSExport协议关联native的方法,要在webView的delegate里面添加

// 以 JSExport 协议关联 native 的方法self.content[@"native"] =self;

添加完之后,要声明一个继承JSExport的协议,协议中声明供JS使用的OC的方法

@protocolTestJSExportJSExportAs(calculateForJS/** handleFactorialCalculateWithNumber 作为js方法的别名 */, - (void)handleFactorialCalculateWithNumber:(NSNumber*)number );- (void)pushViewController:(NSString*)view title:(NSString*)title;-(void)log:(NSString*)l;@end

在OC中实现这些方法,这样就完成了!

如果是第二章方法,则只需要通过block的形式关联JavaScript function就可以了!

self.context[@"log"] = ^(NSString*str){NSLog(@"%@", str);};

三、OC调用JS

OC调用JS

在这个例子中,界面的所有View都是OC创建的,点击“交给JS处理计算阶乘”后,将textfild的数据传给JS,JS计算完成后在返回来!

这里面首先要获取JS里面的计算函数,在OC中,所有表示JS中对象,都用JSValue来创建,通过objectForKeyedSubscript方法或者直接使用下标的方法获取JS对象,然后使用callWithArguments方法来执行函数

// 方法一.  JSValue *function=[self.context objectForKeyedSubscript:@"factorial"];// 方法二.JSValue *function=self.context[@"factorial"];JSValue *result = [functioncallWithArguments:@[inputNumber]];self.showLable.text = [NSString stringWithFormat:@"%@", [result toNumber]];

四、demo之外(慢慢在总结)

1.JS注入

2.在OC中为JS创建对象

......

零碎的补充1:对于JS 函数中,参数中有函数的,在OC中用JSValue接收

// 比如:JS代码functionmyFunc({"text":"这里是文字","callbackFun":function(string){alert'string'}});//OC代码中在.h的protocol中声明JS要调用的OC方法//.h protocol中,函数名称要和JS中相同,这里接收的参数为JSValueJSExportAs(myFunc, -(void) myFunc:(JSValue*)value);//在.m文件中,实现myFunc方法-(void) myFunc:(JSValue*)value{NSString * text = [valuevalueForProperty:@"text"];//打印"这里是文字"JSValue * func =  [valuevalueForProperty:@"callbackFun"];//这里是JS参数中的func;//调用这个函数[func callWithArguments:@[@"这里是参数"]];}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • JavaScriptCore中类和协议: JSContext: JavaScript上下文环境。JSContext...
    HWenj阅读 1,178评论 0 8
  • 随着H5技术的兴起,在iOS开发过程中,难免会遇到原生应用需要和H5页面交互的问题。其中会涉及方法调用及参数传值等...
    Chris_js阅读 3,037评论 1 8
  • 注:JavaScriptCore API也可以用Swift来调用,本文用Objective-C来介绍。 在iOS7...
    JW_T阅读 550评论 0 0
  • OC和JS交互有三种方式:UIWebView(WKWebView)、JavaScriptCore、WebViewJ...
    第1001号群众演员阅读 496评论 0 3
  • 前言 在iOS开发过程中,一般会有遇到需要和UIWebView交互的需求,即native端和网页端的数据交互,因为...
    wuwy阅读 903评论 0 2