iOS网页wkwebview拦截请求,添加头文件

iOS网页wkwebview拦截请求,添加头文件,第1张

遇到一个需求:在网页抛出一切请求时,不管是资源请求还是重定向等,需要拦截掉并在header添加信息,ng拿到去做处理,访问不同资源服务器。

一开始想到的方式是:通过WKNavigationDelegate的代理方法- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler

来在请求之前获得请求信息,并把请求头信息添加进去,如下:

-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{

    NSLog(@"灰度测试h5Url: %@",navigationAction.request.URL.absoluteString)

    if ([navigationAction.request.URL.absoluteString containsString:OUR_URL_ID]) {

        // 拦截所有网络请求头,重新添加参数请求头信息

        NSMutableURLRequest *mutableRequest = [navigationAction.request mutableCopy]

        NSDictionary *requestHeaders = navigationAction.request.allHTTPHeaderFields

        if ([requestHeaders isKindOfClass:[NSDictionary class]]) {

            //简单通过Version_Key判断下是否已经加入了请求信息

            if ([AFNetWorkManager KeyUrlrequestOneNull:requestHeaders]) {

                [AFNetWorkManager addWebDefaultKeyUrlrequest:mutableRequest]

                [webView loadRequest:mutableRequest]

                NSLog(@"灰度测试h5Url: %@ \n请求头:%@",navigationAction.request.URL.absoluteString,mutableRequest.allHTTPHeaderFields)

                decisionHandler(WKNavigationActionPolicyCancel)

                return

            }else{

                //参数正常,放开请求

                NSLog(@"灰度测试h5Url: %@ \n请求头:%@",navigationAction.request.URL.absoluteString,requestHeaders)

                decisionHandler(WKNavigationActionPolicyAllow)

            }

        }else{

            //没有请求头,加上新的请求头,并赋予参数

            mutableRequest.allHTTPHeaderFields = [NSMutableDictionary new]

            [AFNetWorkManager addWebDefaultKeyUrlrequest:mutableRequest]

            [webView loadRequest:mutableRequest]

            NSLog(@"灰度测试h5Url: %@ \n请求头:%@",navigationAction.request.URL.absoluteString,mutableRequest.allHTTPHeaderFields)

            decisionHandler(WKNavigationActionPolicyCancel)

        }

    }else{

        //本地请求资源,pdf等

        decisionHandler(WKNavigationActionPolicyAllow)

    }

}

但是经过打印发现,只拦截了一些html请求,向png、css、js资源请求,并没有拦截到,甚至没有走这个方法。

无奈,只能网上搜索,结果发现了:https://github.com/fenglee594/WKWebViewRequestHook

这个demo,稍加改动,亲测有效。

有时我们用 webView 展示 html 是需要自定义头部视图与底部视图,原生没有像 tableView 那样提供相应的方法。我们只能自己写了。

设置 contentInset,而不是 contentSize。

配置区头:

设置 contentSize 的时机是在 - (void)webViewDidFinishLoad:(UIWebView *)webView 网页加载完成之后,此时 html 网页是和头部视图重叠在一起,需要 1s 左右时间更新视图,体验不好。而使用 contentInset 不会发生这种现象。

在 webView 加载完成后,获取 UIWebBrowserView 的 size 并重新设置 webView 的 contentSize。

UIWebBrowserView 是负责展示 html 内容的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11378257.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存