美文网首页iOS开发知识小集
iOS 使用WKWebView拦截URL崩溃的问题: NSInt

iOS 使用WKWebView拦截URL崩溃的问题: NSInt

作者: CoderZb | 来源:发表于2018-08-23 16:37 被阅读31次

最近项目里面有个需求,点击web页面上的查看详情结果按钮,通过拦截URL的方式,截取URL中的关键字符串,作为get_normstar接口的参数,通过获取到get_normstar接口中返回的h5url,实现跳转到测评结果控制器,然后在这个控制器里面通过h5url加载web页面
window.location.href="objc://"+":/"+str1+":/"+str2;

image.png image.png

设置了拦截,但是发生了崩溃,崩溃代码如下

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{// 类似 UIWebView 的 -webView: shouldStartLoadWithRequest: navigationType:

    NSURL *URL = navigationAction.request.URL;
    NSString * urlStr = [[URL absoluteString] stringByRemovingPercentEncoding];
    
    if([urlStr rangeOfString:@"http://www.yimiaozhaopin.com"].location !=NSNotFound){
        
        NSLog(@"yes");
        NSArray *arr = [urlStr componentsSeparatedByString:@"="];
        self.result_Str = arr[1];
        NSLog(@"哈哈哈哈%@",self.result_Str);
         self.waitMB = [HemaFunction openHUD:@"请稍后"];
        [self requestSeeResult:self.result_Str];
       
        return;
  
    }
     
        decisionHandler(WKNavigationActionPolicyAllow); // 必须实现 加载
        return;
}


解决办法

在第一个return前面加上decisionHandler(WKNavigationActionPolicyCancel);这段能代码。

解释:不调用decisionHandler这个block,会导致app 崩溃。另外,参数是个枚举类型,WKNavigationActionPolicyCancel代表取消加载,相当于UIWebView的代理方法return NO的情况;WKNavigationActionPolicyAllow代表允许加载,相当于UIWebView的代理方法中 return YES的情况。

正确并且完整的代码如下

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{// 类似 UIWebView 的 -webView: shouldStartLoadWithRequest: navigationType:

    NSURL *URL = navigationAction.request.URL;
    NSString * urlStr = [[URL absoluteString] stringByRemovingPercentEncoding];
    
    if([urlStr rangeOfString:@"http://www.yimiaozhaopin.com"].location !=NSNotFound){
        
        NSLog(@"yes");
        NSArray *arr = [urlStr componentsSeparatedByString:@"="];
        self.result_Str = arr[1];
        NSLog(@"哈哈哈哈%@",self.result_Str);
         self.waitMB = [HemaFunction openHUD:@"请稍后"];
         //  获取字符串,并请求数据
        [self requestSeeResult:self.result_Str];
        // 取消加载。取消点击`查看详情结果`按钮的数据加载,做自己想要做的操作
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
  
    }
     
        decisionHandler(WKNavigationActionPolicyAllow); // 必须实现 加载
        return;
}

// 查看答题结果
-(void)requestSeeResult:(NSString *)result_Str{
    NSLog(@"网络请求");
    
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
    [dic setObject:result_Str forKey:@"uuid"];
   
    //    self.waitMB = [HemaFunction openHUD:@"正在调起分享界面"];
    // 使主线程的操作延迟三秒执行
    [NSThread sleepForTimeInterval:3];
    
    [ZBRequest requestWithURL:[NSString stringWithFormat:@"%@%@",REQUEST_MAINLINK,@"get_normstar"] target:self selector:@selector(responseSaveBillOperate:) parameter:dic];
}


- (void)responseSaveBillOperate:(NSDictionary*)info{

    if (self.waitMB){
        [ZBFunction closeHUD:self.waitMB]; self.waitMB=nil;
    }
    if(1 == [[info objectForKey:@"success"] intValue]){
        // 通过h5url,跳转测评结果控制器,然后在测评结果控制器中加载web页面
        AS_ZBPersonnelAssessmentResult *vc = [[AS_ZBPersonnelAssessmentResult alloc]init];
        vc.h5URL = [[info objectForKey:@"infor"][0] objectForKey:@"h5url"];
        [self.navigationController pushViewController:vc animated:YES];
    }else{ 
        [HemaFunction openIntervalHUD:[info objectForKey:@"msg"]];
    }
    
}

相关文章

网友评论

    本文标题:iOS 使用WKWebView拦截URL崩溃的问题: NSInt

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