OC & JS 互调

JS调OC函数步骤:
  • 添加库并导入头文件#import
  • 定义协议JSObjectDelegate类,且不能用@optional修饰(原因未知?);
// 此协议必须遵守 JSExport
// 此协议中的方法就是 web 定义的方法名
@protocol JSObjectDelegate 
#warning 为什么添加了 @optional 下面的方法不会掉用呢 ??
//@optional
- (void)callCamera;
- (void)share:(NSString *)shareContent;
@end
  • 展示webView的类遵守JSObjectDelegate协议;
    @interface BaseWebViewController()

    @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"]];

你可能感兴趣的:(OC & JS 互调)