UIWebView
JS调用OC
1.重定向URL拦截
每次打开一个链接之前,都会触发下面的代理方法
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType
标准的URL包含scheme、host、port、path、query、fragment,通过判断来获取相应的参数和执行的方法
特点:比较灵活,常用于页面的跳转,但无法提供返回值,适用于单向传参,无回调的情况
2.JavaScriptCore(iOS 7.0 +)
WebKit都有一个内嵌的js环境,一般我们在页面加载完成之后,获取js上下文
JavaScriptCore是JS到OC的映射,可以替换各种js方法成oc方法.
//获取上下文
self.context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//设置OC的函数体
self.context[@“JSMethodName”] = ^() {
NSArray *args = [JSContext currentArguments];//获取所有参数
//args中的元素是JSValue,需要转成OC的对象
NSMutableArray *messages = [NSMutableArray array];
for (JSValue *obj in args) {
[messages addObject:[obj toObject]];
}
NSLog(@"js传过来的参数:\n%@", messages);
//do something .....
};
//通过JSExport,设置js的代理为遵循JSExport的实例,在协议中定义交互的方法,在JavaScript中通过指定代理对象名称(比如下面:JavaScriptInterface),来调用协议中定义的方法,实现传参或者获取返回值到js环境
self.context[@"JavaScriptInterface"] = self;
OC调用JS
1.UIWebView的stringByEvaluatingJavaScriptFromString:
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
可以看到返回值是NSString,参数script是js语法组成的字符串
- 通过UIWebview调用
- 无法捕获异常,发生错误返回nil,若无返回值,无法判断调用是否成功
- 返回值是NSString,当是其他类型,则需要进行解析.
- JavaScriptCore(iOS 7.0 +)
通过JSContext的evaluateScript:方法来获取返回值。该方法得到的是一个JSValue对象,所以支持JavaScript的Array、Number、String、对象等数据类型。
//获取标题
JSValue *value = [self.context evaluateScript:@"document.title"];
//设置捕获异常回调
[self.context setExceptionHandler:^(JSContext *context, JSValue *exception){
NSLog(@"%@", exception);
}];
//执行js的函数
[self.context evaluateScript:@“jsMethod()”];
WebViewJavascriptBridge的实现原理:
初始化将Webview的代理设置为自己,对当前self持有一个引用
js调用OC通过代理方法拦截,OC调用js通过webview执行evaluateScript:;将一个名为callback的function作为参数,通过一些封装,传递到OC(js->oc 传递参数和callbackId),然后在OC端执行完毕,再通过block来回调callback(oc->js,传递返回值参数),实现异步获取返回值
网友评论