美文网首页
OC与JS交互 - 传统交互方式

OC与JS交互 - 传统交互方式

作者: SPIREJ | 来源:发表于2019-11-18 22:16 被阅读0次

    UIWebView中OC与JS的传统交互方式特别简单

    1. 这里准备了一个本地的index.html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>OC与JS交互</title>
        <script>
            function showAlert(name){
                alert(name);
                return function handle(str){
                        alert('我是一个弹窗'+name+str);
                        return name + '返回给OC';
                    }
                }
        </script>
    </head>
    <body>
        
        <a href="lgedu:///getSum/helloword/js">点击跳转响应OC方法</a>
        
        <a href="lgedu://getPlus/helloword/js">点击跳转效应</a>
    
        <form id="myform" action="lgedu://www.baidu.com/hello/j/Users/spirej/Desktop/OCJS/index.htmls" method="get">
            <input id="submit" type="submit" value="我是提交">
        </form>
        <input type="button" value="弹框" onclick="showAlert('hello JS')"><br/>
        
    </body>
    </html>
    

    2. JS调用OC

    // 加载所有请求数据,以及控制是否加载
    // JS 调用 OC --> shouldStartLoadWithRequest
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
        
        NSLog(@"scheme = %@", request.URL.scheme); // 标示 我们自己的协议
        NSLog(@"host = %@", request.URL.host); // 方法名
        NSLog(@"pathComponents = %@", request.URL.pathComponents); // 参数
        
        // JS 调用OC 的原理就是 拦截URL
        NSString *scheme = request.URL.scheme;
        if ([scheme isEqualToString:@"lgedu"]) {
            NSArray *array = request.URL.pathComponents;
            if (array.count > 1) {
                NSString *methodName = array[1];
                if ([methodName isEqualToString:@"getSum"]) {
                    [self performSelector:NSSelectorFromString(methodName) withObject:array afterDelay:0];
                    //...
                }
            }
        }
        
        return YES;
    }
    

    JS调用OC就是UIWebViewDelegate的这个代理方法shouldStartLoadWithRequest,其实质就是 拦截URL,解析URL并找到事先约定好的标识,时候判断实现相应的业务逻辑处理。

    下面这些都是JS响应的样式,都会回到UIWebViewDelegate的这个方法来

    UIWebViewNavigationTypeLinkClicked,        点击
    UIWebViewNavigationTypeFormSubmitted,      提交
    UIWebViewNavigationTypeBackForward,        返回
    UIWebViewNavigationTypeReload,             刷新
    UIWebViewNavigationTypeFormResubmitted,    重复提交
    UIWebViewNavigationTypeOther               其他
    

    3. OC调用JS

    - (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
    

    OC调用JS就是实现UIWebView的这个方法stringByEvaluatingJavaScriptFromString,传一个字符串可以是JS里面写的方法名。

    文中所有示例demo可以在这里下载
    https://github.com/SPIREJ/OCJS

    相关文章

      网友评论

          本文标题:OC与JS交互 - 传统交互方式

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