美文网首页
WKSWebView和JS交互(拦截URL)

WKSWebView和JS交互(拦截URL)

作者: 溜溜leesin | 来源:发表于2018-12-14 15:49 被阅读40次

    背景---

    最近两天一直在看iOS js交互的内容,今天看到了一个比较全的文章Haley_Wong iOS和JS交互
    大家可以看一下,我的这篇文章也是参考该文章而来。

    碰到的问题1.下载demo后,点击扫一扫无反应。解决办法:在html中需要改动的如下

                function scanClick() 
                 //   Alert(arr);  这段代码需要注释掉
                    loadURL("haleyAction://scanClick");
                }
    

    碰到的问题2:点击返回按钮无反应,应该是作者写的返回方法不是很正确,修改以及解释如下:

    - (void)goBack
    {
        //判断是否能返回到H5上级页面
        if (self.webView.canGoBack==YES) {
            //返回上级页面
            [self.webView goBack];
            
        }else{
            //退出控制器
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
    

    碰到的问题3:点击修改背景色 无变化,修改代码如下:

    - (void)changeBGColor:(NSURL *)URL
    {
        NSArray *params =[URL.query componentsSeparatedByString:@"&"];
        
        NSMutableDictionary *tempDic = [NSMutableDictionary dictionary];
        for (NSString *paramStr in params) {
            NSArray *dicArray = [paramStr componentsSeparatedByString:@"="];
            if (dicArray.count > 1) {
                NSString *decodeValue = [dicArray[1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                [tempDic setObject:decodeValue forKey:dicArray[0]];
            }
        }
        CGFloat r = [[tempDic objectForKey:@"r"] floatValue];
        CGFloat g = [[tempDic objectForKey:@"g"] floatValue];
        CGFloat b = [[tempDic objectForKey:@"b"] floatValue];
        CGFloat a = [[tempDic objectForKey:@"a"] floatValue];
        
    //这段代码注释的原因:这是修改的self.view的背景色,当然我们可以从图层看到颜色的变化,但是不直观,我们可以直接修改html的颜色,
       // self.view.backgroundColor = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a];
    //修改html的颜色
        [self.webView evaluateJavaScript:@"document.body.style.backgroundColor=\"#EF4A4E\"" completionHandler:nil];
        
    }
    
    当然 以上的问题并不是重点我们需要关注的地方,但是点击无反应我的第一反应回事WKwebview会不会有问题啥的,希望可以消除大家的疑问。

    正文:今天就不上传代码了 因为原作者大大写的比较详细,我就简单讲一下对于url拦截自己的理解。

    首先,在html中有这么一句话:

    iFrame.setAttribute("src", url);
    

    这句话什么意思呢,说实话我也不懂,但是查阅一番资料后:如图,也就是显示这么一个URL,现在这个URL就是我们需要重点关注的东西。它是一个地址,也相当于一个标识符,拦截肯定也需要一些条件,URL包含两部分,scheme和resourceSpecifier 我们就是通过这个scheme标识符判断需不需要进行拦截处理。我感觉和上一篇的messageHandle差不多的意思。

    20130906203103015.png

    在下面Wkwebview的代理方法里处理的拦截的具体操作

    #pragma mark - WKNavigationDelegate
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
    {
    ///拿到资源地址
        NSURL *URL = navigationAction.request.URL;
    ///获取scheme 类似唯一标识符
        NSString *scheme = [URL scheme];
    ///判断是都需要进行拦截处理
        if ([scheme isEqualToString:@"haleyaction"]) {
            
            [self handleCustomAction:URL];
            
            decisionHandler(WKNavigationActionPolicyCancel);
            return;
        }
        decisionHandler(WKNavigationActionPolicyAllow);
    }
    

    每天进步一点点~~~

    相关文章

      网友评论

          本文标题:WKSWebView和JS交互(拦截URL)

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