OC与JS交互---JavaScriptCore

声明

@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);
  };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值