美文网首页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

    相关文章

      网友评论

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

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