zoukankan      html  css  js  c++  java
  • iOS:OC与JS交互

    目的是为了在webView页面截取到js操作,然后跳出到本地进行处理

    第一种方法:使用原生的处理方式

    1.下边是本地的a.html的源代码

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8"/>
            <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
            <meta name="viewport"
            content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
            <script>
                function test() {
                    alert('clicked');
                }
            function testParams(a, b){
                alert(a+b);
            }
            </script>
        </head>
        <body>
            <button onclick="test()">点击我</button>
            <button onclick="testParams('hello', 123)">点击我(带参数)</button>
        </body>
    </html>

    2.导入JavaScriptCore.framework,在需要调用的web页面加上头文件#import <JavaScriptCore/JavaScriptCore.h>

    3.打开本地html文件

     //打开本地html文件
        NSString *filePath = [[NSBundle mainBundle]pathForResource:@"a" ofType:@"html"];
        NSURL *url = [NSURL fileURLWithPath:filePath];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [self.webView loadRequest:request];

    4.开始截获

    - (void)webViewDidFinishLoad:(UIWebView *)webView {
       
        JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        context[@"test"] =  ^() {
            NSLog(@"在这里便可以捕获到函数名为test的操作,这个操作不带参数");
        };
        context[@"testParams"] =  ^(id data,id secondData) {
            NSLog(@"在这里便可以捕获到函数名为testParams的操作,这个操作带两个参数");
            NSLog(@"第一个参数是%@,第二个参数是%@",data,secondData);
            NSArray *args = [JSContext currentArguments];
            for (id obj in args) {
                NSLog(@"遍历每一个参数,%@",obj);
            }
        };
    }

    第二种方法:使用github上的WebViewJavascriptBridge封装库

    1.引入头文件 #import "WebViewJavascriptBridge.h",添加@property WebViewJavascriptBridge* bridge;

    2.开始添加拦截

    if (_bridge) {
            return;
        }
        [WebViewJavascriptBridge enableLogging];
        _bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];
        
        [_bridge registerHandler:@"hubOrderUpdateDeliveryDate" handler:^(id data, WVJBResponseCallback responseCallback) {
            NSDictionary * dataDict = data;
            NSLog(@"testObjcCallback called: %@", data);
            //在此处进行拦截
        }];

    **这个封装库,要求JS函数也按照一定标准写

    **WebViewJavascriptBridge有很多方法,包括OC调用JS,JS调OC,很方便,推荐给大家

  • 相关阅读:
    Codeforces 897 B.Chtholly's request-思维题(处理前一半)
    Codeforces 897 A.Scarborough Fair-字符替换
    51nod 1649.齐头并进-最短路(Dijkstra)
    牛客网 牛客练习赛7 B.购物-STL(priority_queue)
    牛客网 牛客练习赛7 A.骰子的游戏
    hdu 4737 A Bit Fun 尺取法
    Educational Codeforces Round 15 D. Road to Post Office 数学
    Educational Codeforces Round 15 A, B , C 暴力 , map , 二分
    tyvj 1402 乌龟棋 dp
    vijos 1057 盖房子 dp 最大子正方形
  • 原文地址:https://www.cnblogs.com/heyuanbo/p/5309910.html
Copyright © 2011-2022 走看看