NSURLProtocol的使用

在实际工作的项目中,有时会需要在webview的请求中添加认证,比如iOS中UIWebview添加headers认证请求;

  1. 一般的情况下我们可以在请求的时候直接添加headers,创建 NSMutableURLRequest 然后添加header [request setValue:@"header" forHTTPHeaderField: @"key"],这样可以最简单的添加header,用户在第一次请求网络的时候添加上header,然后就可以请求成功;当然这个方法虽然简单,但是有缺陷,因为在实际情况中,webview请求还需要跳转,例如我们在webview中点击链接跳转到下一个页面,这样header就就丢失了;
  2. 我们知道在UIWebviewDelegate 中有代理方法可以拦截到webview的URL请求;在 -(BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType (UIWebViewNavigationType)navigationType 的代理方法中我们可以获取requset的URL,然后通过修改request的URL来添加上我们需要的认证header.[request setValue:@"header" forHTTPHeaderField: @"key"],一切看似解决了,我们可以在每次URL访问代理是否要加载URL的时候来加上自己的header,这样每次Requset请求都可实现。但是你如果在实际运行中你会发现request 请求中添加的header信息根本就没有被上传到服务器。
  3. 通过在网络上查看资料,发现了一种能彻底解决这个问题的方法,那就是通过NSURLProtocol 的方法,咋看之下,你可能认为NSURLProtocol 是一个代理,实际上它是一个OC中的抽象基类。继承于NSURLProtocol的一个子类MyURLProtocol,我们在其类方法canonicalRequestForRequest 修改request 的头信息,这样我们就可以实现我们想要的功能了。
  4. 当然NSURL还有更多强大的功能,在以后实际项目中需要的时候,可以再使用;我把自己学习的demo托管到本人的 github上面了,需要的话可以下载看看

    参考网站: https://www.raywenderlich.com/59982/nsurlprotocol-tutorial

发布了35 篇原创文章 · 获赞 9 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/SunFlowerInRain/article/details/51918964