OC与JS互相调用

OC调用JS

  1. 得到JSContext对象。这个对象可以通过webView得到
[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]

或者通过

JSContext context = [[JSContext alloc] init]; 
[context evaluateScript:[self loadJsFile]]; 

获取。

  1. 提供JS内异常的回调
 context.exceptionHandler = ^(JSContext *context, JSValue *exception) {
            NSLog(@"JS Context Exception: %@", exception);
        };
  1. 获取JS内的方法
JSValue *footBallPrizeRange = context[@"prizeRange"];
  1. 调用方法
JSValue *result = [footBallPrizeRange callWithArguments:@[@(bs)]];

JS调用OC的方法

这个是通过给JS内塞一个OC的对象。然后JS内调用OC这个对象中在JSExport这个协议中注册了的方法。

@protocol YCH5BaseInteractionJSExport 
// 交易明细
- (void)viewTransactionDetail;
@end

@interface YCH5BaseInteraction : NSObject 

// 交易明细
- (void)viewTransactionDetail
{
    dispatch_async_on_main_queue(^{
        ……
    });
}

@end

//在webView加载完后
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    self.context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
        context.exception = exceptionValue;
        NSLog(@"%@", exceptionValue);
    };

    self.context[@"YcNative"] = [[YCH5BaseInteraction alloc] init];
}

问题

  1. 给JS中塞对象的时候,不要把ViewController塞过去,因为即使webView释放了,JSContext对象释放了。塞过去的对象,也不是马上释放。会有延迟。
  2. 使用这种方法。内部会有内存释放不了。C++对象,144Bytes。

你可能感兴趣的:(OC与JS互相调用)