声明
@interface ViewController ()<UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@property (nonatomic, strong) JSContext *context;
初始化
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 异常处理
[context setExceptionHandler:^(JSContext *ctx, JSValue *expectValue) {
NSLog(@"%@", expectValue);
}];
self.context = context;
OC->JS
第一种,单纯的调用方法
// OC代码
JSValue *funcValue = self.context[@"showFunc"];
[funcValue callWithArguments:nil];
// JS中的方法
function showFunc() {
window.alert("这是一个JS中的弹框!")
}
第二种,传值JS
// OC代码
JSValue *funcValue = self.context[@"showValueFunc"];
[funcValue callWithArguments:@[[JSValue valueWithObject:@"OC传值过来" inContext:self.context]]];
// JS中的方法
function showValueFunc(string) {
window.alert("这是一个JS中的弹框!" + string)
}
第三种,传值回调
// OC代码
JSValue *funcValue = self.context[@"showValueFunc"];
JSValue *jsRetureValue = [funcValue callWithArguments:@[[JSValue valueWithObject:@"OC传值过来" inContext:self.context]]];
NSLog(@"js reture value is %@",[jsRetureValue toString]);
// JS中的方法
function showValueFunc(string) {
window.alert("这是一个JS中的弹框!" + string)
return "js value"
}
JS->OC
第一种,单纯调用
// JS代码
<button onclick="JScallOCFunction()">点击这里</button>
js调用此方法后,OC会被触发执行block方法
// OC代码
self.context[@"JScallOCFunction"] = ^{
// do something
};
第二种,传值回调
// JS调用方法传值给OC
function passValueToOC() {
var ocReturnValue = inceptFunc("js value")
window.alert(ocReturnValue) //显示-> "这里是OC"
}
dkfjal
// OC代码
self.context[@"inceptFunc"] = ^JSValue *(JSValue *string) {
NSLog(@"%@",[string toString]);//打印出-> @"js value"
return @"这里是OC";
};
异步回调
JS异步回调OC
// OC代码
void (^block)(void) = ^{
NSLog(@"dsglsajdlf");
};
JSValue *funcValue = self.context[@"callFunc"];
[funcValue callWithArguments:@[[JSValue valueWithObject:block inContext:self.context]]];
// JS代码
function callFunc(returnBlock){
// do something 后
returnBlock()
}
OC异步回调JS
// JS代码
function onCallBack(){
}
function buttonClick(){
ocAlert(onCallBack)
}
// OC代码
self.context[@"ocAlert"] = ^(JSValue *callback){
sleep(2);
[callback callWithArguments:nil];
};
JSExport
.h文件
#import <JavaScriptCore/JavaScriptCore.h>
@protocol HMWebRequestJSExport <JSExport>
JSExportAs(callHandler, - (void)callHandle:(NSString *)HandleName withInfo:(NSString *)info
);
@end
@interface HMWebJSObject : NSObject<HMWebRequestJSExport>
@property (nonatomic,copy)void (^jsCallOCWithBlock)(NSString * name,NSString *info);
@end
.m文件
- (void)callHandle:(NSString *)HandleName withInfo:(NSString *)info {
!self.jsCallOCWithBlock ? : self.jsCallOCWithBlock(HandleName,info);
}
HMWebJSObject * jsObject = [[HMWebJSObject alloc] init];
self.context[@"iOSNative"] = jsObject;
jsObject.jsCallOCWithBlock = ^(NSString * planId,NSString *info){
NSLog(@"%@ %@",planId,info);
};