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

2019-11-18  本文已影响0人  SPIREJ

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

上一篇下一篇

猜你喜欢

热点阅读