100steps/Blogs

OC与js的交互问题

Opened this issue · 0 comments

由于在app中webview的广泛使用,移动端如何与前端交互是一个需要我们考虑的问题,在这里介绍一下iOS开发中OC与js交互的问题。

OC中调用js方法

1.通过UIWebView的stringByEvaluatingJavaScriptFromString进行调用

首先我们需要知道js方法名,比如js方法名为:JSFunc(),那么我们可以通过以下代码来调用

UIWebView *webview=[[UIWebView alloc]init];
[webView stringByEvaluatingJavaScriptFromString:@"JSFunc()"];

注:这个方法是同步的

2.通过WKWebView的evaluateJavaScript进行调用

同样的我们需要知道js方法名,比如js方法名为:JSFunc()

WKWebView *webview=[[WKWebView alloc]init];
[webview evaluateJavaScript:@"JSFunc()" completionHandler:^(id _Nullable script, NSError * _Nullable error) {

 }];

参数1:@param 是调用的js方法,并传值
参数2:如果JavaScript 代码出错, 可以在completionHandler 进行处理.
注:WKWebView在iOS8之后才可以使用,推荐用其代替UIWebView

js调用OC的方法

比起OC中一行就可以调用js方法,js调用OC的方法比较复杂,iOS7引入了JavaScriptCore框架,使得调用变得简单,在这里只介绍JavaScriptCore的使用方法

JavaScriptCore简述

JSValue: 代表一个JavaScript实体,一个JSValue可以表示很多JavaScript原始类型例如boolean, integers, doubles,甚至包括对象和函数。
JSContext: 代表JavaScript的运行环境,你需要用JSContext来执行JavaScript代码。所有的JSValue都是捆绑在一个JSContext上的。
JSExport: 这是一个协议,可以用这个协议来将原生对象导出给JavaScript,这样原生对象的属性或方法就成为了JavaScript的属性或方法,非常神奇。

具体使用方法

首先写一个简单的js方法

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>test javascript</title>
    </head>
    <body>
        <div>
            <button onclick="ttf.OCFunc('JS与OC交互');">点击我然后看xcode的log</button> 
        </div>
    </body>
</html>

然后在OC中新建一个类

//首先引入框架
#import <JavaScriptCore/JavaScriptCore.h>
//定义一个协议继承JSExport协议
@protocol PersonJSExport <JSExport>
- (void)OCFunc:(NSString *)str; //协议里面要声明调用的方法
@end

//我们的自定义类要遵循我们自己定义的这个协议
@interface MyJSObject() <PersonJSExport>
- (void)OCFunc:(NSString *)str;
@end

@implementation MyJSObject
- (void)OCFunc:(NSString *)str {
    NSLog(@"%@", str);
}
@end

向UIWebView对象拿JSContext环境对象,并注入刚才新建的对象

JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

MyJSObject *jsObject = [MyJSObject new];
context[@"ttf"] = jsObject;    //将对象注入这个context中

这样就完成了!
这里只介绍了比较简单的实现方式
详情可以看这篇文章:http://www.jianshu.com/p/59242a92d4f2