IOS中Object-C和JavaScript交互的使用

关于IOS中Object-C和JavaScript的交互方法之前博主介绍过一种,详细见链接http://blog.sina.com.cn/s/blog_9245fd0e0102vxpx.html,大体就是通过把js中CustomJS.getUserInfo()这样的方法重写成协议方法然后注入web界面来实现交互的。

后来博主了解IOS 7之后苹果新增了JavaScriptCore库来实现OC和JS的交互,通过这个库,交互将会更加方便,下边简单介绍一下这个库的使用:

 

首先导入​ JavaScriptCore库文件,我这里一直有两个,不知道什么原因所以全部导入了,然后引入 #import 

然后就进入正题了

JSContext *jsContext =[webvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];这句大体意思就是获取js代码执行的上下文环境​。

CustomJS.getUserInfo()这样的方法一般是安卓使用,安卓可以将类对象命名为CustomJS直接传给js,然后CustomJS.getUserInfo()其实是执行了安卓的一个类的​getUserInfo()方法,这个方法允许有返回值。但是在IOS中怎么办呢,这里我们可以通过

jsContext[@"CustomJS"] = self;​的方式将self赋值给CustomJS,有木有眼熟,跟delegate类似,类似设置代理一样。这里JSContext也可以捕获异常

    jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue){

        context.exception = exceptionValue;

        NSLog(@"发生异常:%@",[exceptionValue toString]);

    };

要想js能够调用OC里边的方法首先我们需要一个协议

先介绍CustomJS.getUserInfo()有返回值需要在js里边赋值的情况

协议如下(注意协议后边一定是JSExport)

@protocol JSObjcDelegate <</span>JSExport>

- (NSString *)getUserInfo;

@end

这个协议是个关键,所有这里的协议方法都可以通过CustomJS来调用,比如这个就可以通过CustomJS.getUserInfoOC来调用,注意js里边是有()的,但是在OC里边后边不能跟()

接下来是协议的实现

- (NSString *)getUserInfo{

    NSString *json = @"";

    return json;

 

}

注意这里返回的一定是json类型的字符串

接下来怎么办呢,我们前边已经说过了,协议方法是可以用CustomJS来调用的,我们所以js中CustomJS.getUserInfo()将会直接调用这个协议方法,返回json字符串,如果此方法不用返回值那么方法类型为void就可以了。

这里还有另外一种情况

    //JS里面调用OC方法,并将结果赋值给CustomJS的a方法

NSString *jsFunctStr=@"CustomJS.a = CustomJS.bOC";

 

[jsContext evaluateScript:jsFunctStr];

什么意思呢,将OC中协议命名的bOC方法的返回值赋值给js代码中的CustomJS.a方法,具体的大家可以自己去研究。

JS给OC传参数

var shareInfo = JSON.stringify({"title": "标题", "desc": "内容", "shareUrl": "http://www.jianshu.com/p/f896d73c670a","shareIco":"http://upload-images.jianshu.io/upload_images/1192353-fd26211d54aea8a9.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240"});

 

CustomJS.share(shareInfo);

对于这样的需要我们在OC中获取CustomJS.share方法的shareInfo参数的我们直接定义并实现协议方法

 

- (void)share:(NSString *)shareString;那么shareString就是shareInfo参数的字符串类型的值

另外一种OC给js传参数

js中的代码如下

 

type="button" value="test" onclick="CustomJS.test()">

        var testJS = function(string){

            alert(string);

 

        }

点击按钮,给testJS赋值并弹出

首先定义并实现test协议

- (void)test{

    NSLog(@"test");

    //回调js方法

    JSValue *testCallback = jsContext[@"testJS"];

    [testCallback callWithArguments:@[@"这是OC代码返回的数据"]];

 

}

这样testJS方法就能弹出"这是OC代码返回的数据"的弹出框了

需要注意也是最重要的是

由于这些协议方法是在子线程中调用,所以有些操作需要返回主线程

 

比如调用手机相机,此处如果不返回主线程调用相机相册,将会有crash的警告信息

好了,今天先介绍到这里,刚开始学习这个库,有什么介绍不全的,还请大家谅解

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值