美文网首页WKWebView
JS和OC互相调用

JS和OC互相调用

作者: Hardy_Hu | 来源:发表于2017-11-08 16:06 被阅读0次

在开发中APP端嵌入了越来越多的html网页,html页面已经不仅仅满足展示功能,还需要能与原生语言进行交互、相互传值。今天就写个简单的Demo 记录下JS和OC之间的互相调用, 运行成功后的界面如下:


交互界面.png

需要达到:

  1. 点击HTML页面上的按钮,能调用OC方法;
  2. 点击VC上的按钮,能调用JS方法。

实现代码

  1. 首先导入事先写好的HTML文件, 内容大致如下:
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <div>
        <h2>JS与OC交互</h2>
       <input type="button" value="JS调用OC-1" onclick="call()">
    </div>

<script>
    
    var call = function()
    {
        var callInfo = JSON.stringify('JS调用OC');
        callBackToOC(callInfo);
    }

    var ocClick = function (str)
    {
        alert(str);
    }

</script>
</body>
</html>
  1. 在我们的VC中引用#import <JavaScriptCore/JavaScriptCore.h>, 并使用UIWebView去加载上面的html文件, 写好JS和OC交互的界面。
- (void)viewDidLoad
{
    [super viewDidLoad];
   
    self.webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 20, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 100)];
    self.webView.delegate = self;
    [self.view addSubview:self.webView];
    
    UIButton *ocBut = [UIButton buttonWithType:UIButtonTypeCustom];
    ocBut.backgroundColor = [UIColor greenColor];
    ocBut.frame = CGRectMake(10, [UIScreen mainScreen].bounds.size.height - 80, [UIScreen mainScreen].bounds.size.width - 20, 30);
    [ocBut setTitle:@"OC调用JS方法" forState:UIControlStateNormal];
    [ocBut setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [ocBut addTarget:self action:@selector(butClick:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:ocBut];
    
    NSString* path = [[NSBundle mainBundle] pathForResource:@"Demo" ofType:@"html"];
    NSURL* url = [NSURL fileURLWithPath:path];
    NSURLRequest* request = [NSURLRequest requestWithURL:url] ;
    [self.webView loadRequest:request];
}
  1. 实现WebView加载完毕的代理
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
        context.exception = exceptionValue;
        NSLog(@"异常信息:%@", exceptionValue);
    };
    // 监听JS按钮事件的回调
    self.jsContext[@"callBackToOC"] =^{
        NSArray *arg = [JSContext currentArguments];
        for (id obj in arg)
        {
             NSLog(@"%@",obj);
        }
    };
}

加载完毕html页面后,通过监听JS点击事件后callBackToOC方法的回调拿到JS传过来的值,达到JS调用OC的目的。点击html页面上的按钮就能看到JS传过来的消息:

2017-11-08 15:52:41.544201+0800 JavaScript[39008:2528651] "JS调用OC"
  1. 实现VC上面按钮的点击事件
- (void)butClick:(UIButton *)sender
{
    [self.jsContext evaluateScript:@"ocClick('OC调用JS')"];
}

点击vc上面的按钮,就能看到OC调用JS的弹出框。


OC调用JS.png

代码上传GitHub

相关文章

  • iOS与JS(一):使用URL拦截的方式进行JS与OC互相调用

    参考:iOS下JS与OC互相调用(二)--WKWebView 拦截URLiOS下JS与原生OC互相调用(总结) 关...

  • JS和OC互相调用

    在开发中APP端嵌入了越来越多的html网页,html页面已经不仅仅满足展示功能,还需要能与原生语言进行交互、相互...

  • js和oc互相调用

    https://blog.csdn.net/kangpengpeng1/article/details/10601...

  • UIWebView

    加载请求 JS和OC互相调用 利用NSInvocation 和 performSelector 实现传递无限参数 ...

  • 记录JsBridge

    JsBridge:java(ios为oc)和js的互相调用的桥梁 JS和Native交互: JS是基于订阅和回调来...

  • 重启面试之路 - 6.WebView

    一、说一下 JS 和 OC 互相调用的几种方式? 1、js调用oc的三种方式: 根据网页重定向截取字符串通过url...

  • WKWebView

    马杀鸡,魂斗罗 iOS下JS与OC互相调用WKWebView + WebViewJavascriptBridge(...

  • iOS与JS(二):MessageHandler(OC&

    参考:iOS下JS与OC互相调用(三)--MessageHandler iOS与JS的相互调用除了URL拦截(iO...

  • WebViewJavascriptBridge 使用

    目的 掌握 OC 调用 JS方法 JS 调用 OC方法 OC——>sender JS——> sender OC 调...

  • js iOS原生交互

    一、交互(UIWebView) 1、OC调用JS (1)OC调用代码 (2)JS代码 2、JS调用OC (1)OC...

网友评论

    本文标题:JS和OC互相调用

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