OC & JS 互调

作者: iOS_Job | 来源:发表于2016-07-12 23:14 被阅读162次
    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"]];
    

    相关文章

      网友评论

        本文标题:OC & JS 互调

        本文链接:https://www.haomeiwen.com/subject/vwjsjttx.html