美文网首页ios开发混合开发
原生JS交互(一)—— UIWebView拦截URL

原生JS交互(一)—— UIWebView拦截URL

作者: CoderXLL | 来源:发表于2018-05-30 17:40 被阅读570次

    一、聊点废话

    先啰嗦两句。。。
    移动端开发的时候,很多时候会出现这样的情况,有些页面用H5来写,移动端使用UIWebView或WKWebView进行加载。偶尔会出现交互的情况,这都很正常。
    写这篇文章的初衷有两个:

    根本原因:想涉足到混合开发方面,所以从最开始的WebView入手。
    直接原因:新公司前端开发人员,针对这个功能无法实现,很自信地认为是我的问题。(坑-_-)

    所以想帮助前端搞清楚原因,同时要彻底搞明白JS与OC交互实现细节与流程。

    二、UIWebView拦截URL(JS与原生实现)

    1. 首先先写一个简单的前端代码。(JS重要的一步)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>拦截url</title>
        <script language="javascript">
            function loadURL(url) {
                var iFrame;
                iFrame = document.createElement("iframe");
                iFrame.setAttribute("src", url);
                iFrame.setAttribute("style", "display:none;");
                iFrame.setAttribute("height", "0px");
                iFrame.setAttribute("width", "0px");
                iFrame.setAttribute("frameborder", "0");
                document.body.appendChild(iFrame);
                // 发起请求后这个iFrame就没用了,所以把它从dom上移除掉
                iFrame.parentNode.removeChild(iFrame);
                iFrame = null;
            }
            /*拦截function*/
            function testBtnClick() {
                loadURL('mamami://click')
            }
        </script>
    
    </head>
    <body>
    <button onclick="testBtnClick()">移动端拦截</button>
    </body>
    </html>
    

    如上,简单搞一个button标签,其相应function,我们用js调用loadURL这个function。js处理的其实就是创建一个页面,然后将这个页面移除(做一个跳转的假象)。这样移动端既可以拦截loadURL里的参数,H5那边也不会跳转至别的页面。实现思路来源于UIWebView的使用总结——唐巧。

    2.UIWebView加载HTML
    UIWebView *webView = [[UIWebView alloc] init];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"first" ofType:@"html"];
    NSString *htmlString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    NSURL *url = [[NSURL alloc] initWithString:path];
    [webView loadHTMLString:htmlString baseURL:url];
    webView.delegate = self;
    [self.view addSubview:webView];
    self.webView = webView;
    
    3.UIWebView代理拦截URL
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        NSString *urlStr = request.URL.absoluteString;
        if ([urlStr rangeOfString:@"mamami://click"].length > 0)
        {
            NSLog(@"拦截成功");
            return NO;
        }
        return YES;
    }
    
    4.UIWebView 原生调用JS (这种function,前端要放在window下,写成全局没用。为什么前端蜜汁自信window下的function与全局function一样呢?)

    我们在JS里增加一个function,功能是1秒后弹窗alert

    function ocInvoke(param01, param02) {
         var content = param01+","+param02;
         setTimeout(function () {
              alert(content);
          },1);
    }
    

    使用UIWebView调用JS方法,如下

    NSString *jsStr = [NSString stringWithFormat:@"ocInvoke('%@','%@')", @"我", @"是"];
    [self.webView stringByEvaluatingJavaScriptFromString:jsStr];
    
    三、总结

    大部分情况下,作为移动端的我们是不用去考虑JS如何实现的。但是遇到不靠谱或者喜欢甩锅的前端开发,多了解些东西,对他们甩来的锅可以很好地防御过去。就这样~

    相关文章

      网友评论

        本文标题:原生JS交互(一)—— UIWebView拦截URL

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