设为首页收藏本站

IT技术擎 - 最棒的IT web技术交流社区

 找回密码
 注册为IT技术擎人

QQ登录

只需一步,快速开始

搜索
热搜: php h5 jquery
查看: 12|回复: 0

[未分类] js(javascript)与OC(Objective-C)交互

[复制链接]

7404

主题

7404

帖子

2万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
23692
发表于 2018-1-11 18:00:09 | 显示全部楼层 |阅读模式
实质上oc与js的通信交互就是发送消息,也即函数调用,iOS7以后官方公布JavaScriptCore framework中很方便我们对他们之间的相互调用。在以前我们只能通过UIWebView的UIWebViewDelegate协议来实现.
  1. 1<br>
复制代码
  1. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;<br>
复制代码
或者
  1. 1<br>
复制代码
  1. - (void)webViewDidStartLoad:(UIWebView *)webView;<br>
复制代码

  • oc &ndash; >js stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数、一句js代码或他们的组合),当js函数有返回值或一句js代码有值返回可通过stringByEvaluatingJavaScriptFromString的返回值获取
  • js &ndash; >oc 利用webView的重定向原理(即重新在js中指定document.location的值,此为一url),只要在这个url字符串中按自定义的规则指定好所需调用oc中的函数和参数,然后通过OC中的shouldStartLoadWithRequest函数去捕获处理请求。

一 JS调用OC
js调用iOS分两种情况
js里面直接调用方法 js里面通过对象调用方法
js里面直接调用方法
  1. 1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>
复制代码
  1. - (void)webViewDidStartLoad:(UIWebView *)webView{<br>
  2. <br> //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)<br> JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];<br> //其中getCurrentUser就是js的方法名称,赋给是一个block 里面是iOS代码<br> context[@"getCurrentUser"] = ^() {<br> //在block中写OC代码<br> return [[NSUserDefaults standardUserDefaults]objectForKey:@"MYJSANDOC"];<br> };<br> context[@"encodeParam"] = ^() {<br> NSArray *args = [JSContext currentArguments];<br> NSString *param = [NSString stringWithFormat:@"%@",args[0]];<br> NSString *result = [[[YXBaseRequestManager alloc]init]encryptUseAES:param key:@"1%7jhs#Zjasd &tr*"];<br> return result;<br> };<br>
  3. <br>}<br>
复制代码
js里面通过对象调用方法在这个方法中我们需要使用到
  1. JSExport
复制代码
  1. JSExport
复制代码
是一个协议,自定义协议后,里面的声明变量等会对JS开放,我们即可调用。 首先我们要自定义一个协议,添加头文件
  1. #import <JavaScriptCore/JavaScriptCore.h >
复制代码
,继承自
  1. NSObject
复制代码
  1. 1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>
复制代码
  1. <br>
  2. #import <Foundation/Foundation.h > <br>
  3. #import <JavaScriptCore/JavaScriptCore.h > <br>
  4. <br>
  5. //首先创建一个实现了JSExport协议的协议 <br>
  6. @protocol JSObjectText <JSExport > <br>
  7. <br>
  8. //此处我们测试几种参数的情况 <br>-(void)JSObjectTextPush; <br>
  9. <br>
  10. @end <br>
  11. <br>
  12. //让我们创建的类实现上边的协议 <br>
  13. @interface JSObject : NSObject <JSObjectText > <br>
  14. <br>
  15. @end<br>
复制代码
在.m中实现
  1. 1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>
复制代码
  1. #import "JSObjectText.h" <br>
  2. <br>
  3. @implementation JSObjectText <br>
  4. <br>
  5. //本地储存Key,调用之后, 检查key是否存在则说明是否条用了原生方法<br>-(void)JSObjectTextPush <br>{ <br> [[NSUserDefaults standardUserDefaults]objectForKey:@"MYJSANDOC"];<br>} <br>
  6. <br>
  7. @end<br>
复制代码
在weibview加载完成之后调用
  1. 1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>
复制代码
  1. -(void)webViewDidFinishLoad:(UIWebView *)webView <br>{ <br> //网页加载完成调用此方法 <br><br> //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext) <br> JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; <br><br> //第二种情况,js是通过对象调用的,我们假设js里面有一个对象 testobject 在调用方法 <br> //首先创建我们新建类的对象,将他赋值给js的对象 <br><br> JSObjectText *text=[JSObjectText new]; <br> context[@"testobject"]=text; <br><br> //同样我们也用刚才的方式模拟一下js调用方法 <br> NSString *jsStr=@"testobject.JSObjectTextPush()"; <br> [context evaluateScript:jsStr]; <br>
  2. <br><br>}<br>
复制代码
二 OC调用JS方法很简单,在加载webview后,通过点击事件,或者 返回值,调用
  1. stringByEvaluatingJavaScriptFromString
复制代码
来实现调用JS代码
  1. 1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>
复制代码
  1. /*<br>* 点击事件<br>* 调用javaScript的方法postStr()并取得返回值<br>* 输出返回值到控制台<br>*/<br>-(void)ocFromJs:(id)sender<br>{<br> NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"postStr();"];<br> NSLog(@"JS返回值:%@",str);<br>}
复制代码



上一篇:Bash显示history记录中命令执行时间的方法
下一篇:Linux 常用命令十 which cal date
该用户未在地球留下任何的痕迹

本版积分规则

QQ|小黑屋|帮助|IT技术擎 ( 沪ICP备15054863号  

GMT+8, 2018-1-21 07:04

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表