JS调OC函数步骤:
- 添加库并导入头文件#import <JavaScriptCore/JavaScriptCore.h>;
- 定义协议JSObjectDelegate<JSExport>类,且不能用@optional修饰(原因未知?);
// 此协议必须遵守 JSExport
// 此协议中的方法就是 web 定义的方法名
@protocol JSObjectDelegate <JSExport>
#warning 为什么添加了 @optional 下面的方法不会掉用呢 ??
//@optional
- (void)callCamera;
- (void)share:(NSString *)shareContent;
@end
展示webView的类遵守JSObjectDelegate协议;
@interface BaseWebViewController()
<JSObjectDelegate,UIWebViewDelegate>
@property (nonatomic, strong) UIWebView *webView;
@property (nonatomic, strong) JSContext *jsContext;
@end-
-(void)webViewDidFinishLoad:(UIWebView *)webView 方法中注入OC与web的桥梁对象为self;
- (void)webViewDidFinishLoad:(UIWebView *)webView { // 网页加载完成 // 首先创建一个 JSContext 对象,通过当前的webView的键值获取 self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScri ptContext"]; // Toyun 为 web 和 OC 定义的 注入桥梁对象名Toyun, self.jsContext[@"Toyun"] = self; self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) { NSLog(@"异常信息:%@", exceptionValue); }; }
JSObjectDelegate 方法实现:
#pragma mark -- JSObjectDelegate
- (void)callCamera
{
NSLog(@" /// JS Call OC callCamera ///");
// 执行完OC代码,,有必要则回调 JS
// JSValue *picCallback = self.jsContext[@"picCallback"];
// [picCallback callWithArguments:@[@"images"]];
NSString *jsFuncStr = @"picCallback('images')";
[self.jsContext evaluateScript:jsFuncStr];
}
- (void)share:(NSString *)shareContent
{
NSLog(@" /// JS Call OC Share: %@",shareContent);
// 执行完OC代码,,有必要则回调 JS
// JSValue *shareCallback = self.jsContext[@"shareCallback"];
// [shareCallback callWithArguments:nil];
NSString *jsFuncstr2 = @"shareCallback()";
[self.jsContext evaluateScript:jsFuncstr2];
}
OC回调JS的两种方法:
1、 读取回调web页面的方法转化为string,用jsContext调用:
NSString *jsFuncStr = @"picCallback('images')";
[self.jsContext evaluateScript:jsFuncStr];
2、将web页面的方法名转化为JSValue,再调用:
JSValue *picCallback = self.jsContext[@"picCallback"];
[picCallback callWithArguments:@[@"images"]];