美文网首页
ios webView中NSURLRequest添加Http头

ios webView中NSURLRequest添加Http头

作者: 有梦才可以远航 | 来源:发表于2019-03-20 20:02 被阅读0次

    webView加载url时,我们只需将字符串url转换为NSMutableURLRequest的request,然后执行
    根据field修改设置value, field要严格遵守http协议
    - (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field;

    \\如下:

        NSURL *url = [NSURL URLWithString:htmlString];
        NSMutableURLRequest  *request = [NSMutableURLRequest requestWithURL:url];
        
        [self.request setValue:@"cbsxf" forHTTPHeaderField:@"client_identify"];
      
        [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5.0];
        [NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]];
        [self.webView loadRequest:self.request];
    

    上面的知识想必大家都会的,接下来进入正题,webView加载url只是前提,接下来我们在已加载的webView中操作点击下一级时,该如何处理那?
    首先我们需要找到webView代理方法:
    webview每次加载之前都会调用这个方法, 如果返回NO,代表不允许加载这个请求
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
    然后通过判断来决定执行那部分的url,判断方式需要您自定义,如果您整体执行添加http头,可跳过此步。
    下面举例:

    - (BOOL)webView:(UIWebView *)awebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
         NSString * const kBaseUrl = @"http://www.test.cn/demo/";
         if ([kBaseUrl localizedCaseInsensitiveContainsString:[[request URL] host]]) {
            NSURL *url = [request URL];
            //默认的缓存策略,根据HTTP头中的信息进行缓存处理
            NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
            
            [request setValue:@"cbsxf" forHTTPHeaderField:@"client_identify"];
            //重新加载request
            [webView loadRequest:request];
          }
          return YES;
    }
    
    

    备注:localizedCaseInsensitiveContainsString 可查看我的另一篇文章
    OC代码小知识


    看似已经完成,运行项目后,会发现CPU暴涨为100%+。
    查看原因,断点调试,发现CPU暴涨原因,webView一直在重复执行代理中的[webView loadRequest:request];
    解决办法:优化loadRequest加载方式

    //开始加载
    - (BOOL)webView:(UIWebView *)awebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        //通过判断是否已经添加成功Http头
        BOOL headerIsPresent = [[request allHTTPHeaderFields] objectForKey:@"client_identify"] != nil;
        if(headerIsPresent){
            return YES;
        }
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                NSURL *url = [request URL];
                //默认的缓存策略,根据HTTP头中的信息进行缓存处理
                NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    
                [request setValue:@"cbsxf" forHTTPHeaderField:@"client_identify"];
               
                [webView loadRequest:request];
            });
        });
        return NO;
    }
    

    看样子应该是没问题了,运行项目,跳转webview所在页面(A),点击webView中link(B),观察CPU,发现好了。
    这时候我点击了左上角的返回按钮想重进确认下,结果发现页面一直在循环,B-->A-->B-->A--> ......-->B,无线循环,根本跳转不出来。
    继续断点调试,发现返回后,先是执行代理中的return NO,然后又去执行的[self.webView loadRequest:request],反反复复。
    解决办法:监听我们执行的返回操作,也就是[self.webView goBack];

    //开始加载
    - (BOOL)webView:(UIWebView *)awebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        //通过判断是否已经添加成功Http头
        BOOL headerIsPresent = [[request allHTTPHeaderFields] objectForKey:@"client_identify"] != nil;
        //操作类型为前进后退时,正常去加载request
        if (navigationType == UIWebViewNavigationTypeBackForward) {
            return YES;
        }
        if(headerIsPresent){
            return YES;
        }
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                NSURL *url = [request URL];
                //默认的缓存策略,根据HTTP头中的信息进行缓存处理
                NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    
                [request setValue:@"cbsxf" forHTTPHeaderField:@"client_identify"];
               
                [webView loadRequest:request];
            });
        });
        return NO;
    }
    

    运行项目,测试无误。


    以上是本人在webView中点击跳转多级link并且需要添加http头时处理办法,如果您有更好的办法,欢迎讨论指正。

    欢迎互相学习Github

    相关文章

      网友评论

          本文标题:ios webView中NSURLRequest添加Http头

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