OC调用JS
- 得到JSContext对象。这个对象可以通过webView得到
[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]
或者通过
JSContext context = [[JSContext alloc] init];
[context evaluateScript:[self loadJsFile]];
获取。
- 提供JS内异常的回调
context.exceptionHandler = ^(JSContext *context, JSValue *exception) {
NSLog(@"JS Context Exception: %@", exception);
};
- 获取JS内的方法
JSValue *footBallPrizeRange = context[@"prizeRange"];
- 调用方法
JSValue *result = [footBallPrizeRange callWithArguments:@[@(bs)]];
JS调用OC的方法
这个是通过给JS内塞一个OC的对象。然后JS内调用OC这个对象中在JSExport这个协议中注册了的方法。
@protocol YCH5BaseInteractionJSExport <JSExport>
// 交易明细
- (void)viewTransactionDetail;
@end
@interface YCH5BaseInteraction : NSObject <YCH5BaseInteractionJSExport>
// 交易明细
- (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];
}
问题
- 给JS中塞对象的时候,不要把ViewController塞过去,因为即使webView释放了,JSContext对象释放了。塞过去的对象,也不是马上释放。会有延迟。
- 使用这种方法。内部会有内存释放不了。C++对象,144Bytes。