本文是在此文章的基础上加入了一点自己的理解,方便在以后工作中需要用到时快速学习。
步骤:
- 先将html文件加入webView中;
- 在webView加载完成的回调函数中获取JSContext对象,使用
_jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
获取JSContext对象,并将self赋值给JSContext中的某属性,代码中使用的是tw
,这样做是为了让js能调用到self中的方法。 - js能代用到oc方法必须是在
<JSExport>
协议中声明的方法。
js调用oc
完成上述准备步骤后,在js中可直接通过tw.function()
调用<JSExport>
协议中声明的方法。
oc调用js
//作用类似获取某个函数
JSValue *Callback = _jsContext[@"Callback"];
//调用获取到的函数 并传入参数
[Callback callWithArguments:@[@"唤起本地OC回调完成"]];
// 直接调用js中的方法
NSString *str = @"Callback('OC添加JS提示成功')";
[_jsContext evaluateScript:str];
html文件代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div style="margin-top:20px">
<h2>JS与OC交换</h2>
<input type="button" value="唤起本地方法(call)" onclick="tw.call()">
</div>
<div>
<input type="button" value="唤起getCall:(NSString *)callString传值", onclick="call()">
</div>
<script>
var call = function() {
var callInfo = JSON.stringify({"百度": "http://www.baidu.com"});
tw.getCall(callInfo);
}
var Callback = function(str) {
alert(str+"1212");
}
var alerCallback = function() {
alert("成功");
}
</script>
</body>
</html>
.h文件代码
#import <UIKit/UIKit.h>
#import <JavaScriptCore/JavaScriptCore.h>
// JS 调用的OC方法 需要在协议中声明
@protocol JSObjectDelegate <JSExport>
- (void)call;
- (void)getCall:(NSString*)callString;
@end
@interface JSViewController : UIViewController
@end
.m文件代码
#import "JSViewController.h"
#import "UIViewController+push.h"
#import "constant.h"
@interface JSViewController () <UIWebViewDelegate, JSObjectDelegate>
{
JSContext *_jsContext;
UIWebView *_webView;
}
@end
@implementation JSViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"JS与OC交换";
self.view.backgroundColor = [UIColor whiteColor];
[self addMoTaiBack];
_webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-0)];
_webView.delegate = self;
//从本地加载html文件
NSString* path = [[NSBundle mainBundle] pathForResource:@"js" ofType:@"html"];
NSURL* url = [NSURL fileURLWithPath:path];
NSURLRequest* request = [NSURLRequest requestWithURL:url] ;
[_webView loadRequest:request];
[self.view addSubview:_webView];
}
// 加载完成
- (void)webViewDidFinishLoad:(UIWebView *)webView {
// 设置javaScriptContext上下文
_jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
_jsContext[@"tw"] = self;
_jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionValue;
NSLog(@"异常信息:%@", exceptionValue);
};
}
- (void)call {
NSLog(@"call");
//作用类似获取某个函数
JSValue *Callback = _jsContext[@"Callback"];
//调用获取到的函数
[Callback callWithArguments:@[@"唤起本地OC回调完成"]];
// [self alert];
}
- (void)getCall:(NSString *)callString{
NSLog(@"Get:%@", callString);
// 成功回调JavaScript的方法Callback
JSValue *Callback = _jsContext[@"alerCallback"];
[Callback callWithArguments:nil];
}
- (void)alert{
// 直接添加提示框
NSString *str = @"Callback('OC添加JS提示成功')";
[_jsContext evaluateScript:str];
}
@end