关于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的警告信息
好了,今天先介绍到这里,刚开始学习这个库,有什么介绍不全的,还请大家谅解