ios webView中NSURLRequest添加Http头

2019-03-20  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读