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

相关文章

  • JS与OC交互

    iOS js oc相互调用(JavaScriptCore) iOS js oc相互调用(JavaScriptCor...

  • OC & JS 互调

    JS调OC函数步骤: 添加库并导入头文件#import

  • WKWebView 自有方式js回调等常见问题

    WKWebView 自有方式解决js-oc互调时,发现在js调用oc并需要oc回调js时有问题,请看目录二、WKW...

  • JS与OC交互

    JS调用OCOC调用JS JS与OC 相互调用 //网页加载完成调用此方法

  • iOS开发-UIWebView

    一、WebView的基本使用 二、OC和JS代码的互调

  • cocos creator和Objective-C互调用

    本文为ios开发环境下js和obc相互调用的例子。 一 、js调用oc js oc建一个AdMaster文件,继承...

  • oc,js互调

    1)oc调js方法(通过data可以传值,通过 response可以接受js那边的返回值 ) iddata=@{@...

  • JS与原生OC/Swift相互调用总结

    JS和OC/Swift相互调用,主要总结了JS和OC交互的三种方式1.使用UIWebView,利用JavaScri...

  • Object-C与JavaScript通信

    关于JS与OC互调的方法,用的较多的有以下两种方式: 一、简单的: 1)OC调用JS: OC提供了系统方法: NS...

  • OC和JS调用

    一:webview:互调底层用的JavaScriptCore js调用oc方法,然后把方法结果返回给js 例如:用...

网友评论

    本文标题:OC & JS 互调

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