WKSWebView和JS交互(拦截URL)

149 阅读2分钟

背景---

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

##碰到的问题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);
}

每天进步一点点~~~