当前位置: 首页 > news >正文

大连网站策划推进网站 集约化建设

大连网站策划,推进网站 集约化建设,深圳做网站公,住房和城乡建设领域从业人员证书一、概念 NSURLProtocol也是苹果众多黑魔法中的一种#xff0c;使用它可以轻松地重定义整个URL Loading System。当你注册自定义NSURLProtocol后#xff0c;就有机会对所有的请求进行统一的处理#xff0c;基于这一点它可以让你#xff1a; 1.自定义请求和响应 2.提供自定义…  一、概念 NSURLProtocol也是苹果众多黑魔法中的一种使用它可以轻松地重定义整个URL Loading System。当你注册自定义NSURLProtocol后就有机会对所有的请求进行统一的处理基于这一点它可以让你 1.自定义请求和响应 2.提供自定义的全局缓存支持 3.重定向网络请求 4.提供HTTP Mocking (方便前期测试) 5.其他一些全局的网络请求修改需求 二、如果注册多个URLProtocol会怎么样 1.最后注册的Protocol最先执行。即倒序遍历。 2.如果其中一个Protocol的canInitWithRequest方法返回了YES则后续的Protocol不再执行否则会一直遍历直到找到能处理此请求的Protocol。 三、使用方法 1.继承NSURLPorotocl并注册你的NSURLProtocol [NSURLProtocol registerClass:[MyURLProtocol class]]; 当NSURLConnection准备发起请求时它会遍历所有已注册的NSURLProtocol询问它们能否处理当前请求。所以你需要尽早注册这个Protocol。 2.对于NSURLSession的请求注册NSURLProtocol的方式稍有不同是通过NSURLSessionConfiguration注册的: NSURLSessionConfiguration *configuration [NSURLSessionConfiguration defaultSessionConfiguration]; NSArray *protocolArray [ [MyURLProtocol class] ]; configuration.protocolClasses protocolArray; NSURLSession *session [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]]; NSURLSessionTask *task [session dataTaskWithRequest:request]; [task resume]; 3. 请求结束后注销NSURLProtocol [NSURLProtocol unregisterClass:[MyURLProtocol class]]; 4.实现NSURLProtocol的相关方法 (1)当遍历到我们自定义的NSURLProtocol时系统先会调用canInitWithRequest:这个方法。顾名思义这是整个流程的入口只有这个方法返回YES我们才能够继续后续的处理。我们可以在这个方法的实现里面进行请求的过滤筛选出需要进行处理的请求。 (BOOL)canInitWithRequest:(NSURLRequest *)request {if ([NSURLProtocol propertyForKey:MyURLProtocolHandled inRequest:request]){return NO;}if (![scheme hasPrefix:http]){return NO;}return YES; } (2)当筛选出需要处理的请求后就可以进行后续的处理需要至少实现如下4个方法 (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {return request; } (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b {return [super requestIsCacheEquivalent:a toRequest:b]; }- (void)startLoading {NSMutableURLRequest *mutableReqeust [[self request] mutableCopy];[NSURLProtocol setProperty:(YES) forKey:MyURLProtocolHandled inRequest:mutableReqeust];self.connection [NSURLConnection connectionWithRequest:mutableReqeust delegate:self]; }- (void)stopLoading {[self.connection cancel];self.connection nil; } 说明 (1)canonicalRequestForRequest: 返回规范化后的request,一般就只是返回当前request即可。 (2)requestIsCacheEquivalent:toRequest: 用于判断你的自定义reqeust是否相同这里返回默认实现即可。它的主要应用场景是某些直接使用缓存而非再次请求网络的地方。 (3)startLoading和stopLoading 实现请求和取消流程。 5.实现NSURLConnectionDelegate和NSURLConnectionDataDelegate 因为在第二步中我们接管了整个请求过程所以需要实现相应的协议并使用NSURLProtocolClient将消息回传给URL Loading System。在我们的场景中推荐实现所有协议。 - (nullable NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(nullable NSURLResponse *)response {if (response ! nil){[[self client] URLProtocol:self wasRedirectedToRequest:request redirectResponse:response];}return request; }- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {[self.client URLProtocol:self didReceiveAuthenticationChallenge:challenge]; }- (void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {[self.client URLProtocol:self didCancelAuthenticationChallenge:challenge]; }- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:[[self request] cachePolicy]]; }- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {[self.client URLProtocol:self didLoadData:data]; }- (void)connectionDidFinishLoading:(NSURLConnection *)connection {[self.client URLProtocolDidFinishLoading:self]; }- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {[self.client URLProtocol:self didFailWithError:error]; } 四、NSURLProtocol那些坑 坑1企图在canonicalRequestForRequest:进行request的自定义操作导致各种递归调用导致连接超时。这个API的表述其实很暧昧: It is up to each concrete protocol implementation to define what “canonical” means. A protocol should guarantee that the same input request always yields the same canonical form. 所谓的canonical form到底是什么呢而围观了包括NSEtcHosts和RNCachingURLProtocol在内的实现它们都是直接返回当前request。在这个方法内进行request的修改非常容易导致递归调用(即使通过setProperty:forKey:inRequest:对请求打了标记) 坑2没有实现足够的回调方法导致各种奇葩问题。如connection:willSendRequest:redirectResponse: 内如果没有通过[self client]回传消息那么需要重定向的网页就会出现问题:host不对或者造成跨域调用导致资源无法加载。 坑3.崩溃报错 0 libobjc.A.dylib objc_msgSend 16 1 CFNetwork CFURLProtocol_NS::forgetProtocolClient() 124 有一点苹果说明的不是很清楚苹果自己实现CustomHTTPProtocol源码中很好的体现了这一点 NSURLProtocolClient回调动作必须跟请求的托管发送保持在一个线程、相同的Runloop具体实现逻辑如下 (1)在start方法中记录当前线程和Runloop模式 (2)所有对于NSURLProtocolClient的回调都在记录的线程、以相同的Runloop模式触发使用如下方法 [self performSelector:onThread:withObject:waitUntilDone:modes:]; 坑4httpBody NSURLProtocol在拦截NSURLSession的POST请求时不能获取到Request中的HTTPBody。苹果官方的解释是Body是NSData类型而且还没有大小限制。为了性能考虑拦截时就没有拷贝。 坑5Protocol请求拦截对证书认证方法的影响 因为URLConnection新增了证书认证方法 - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 但是NSURLProtocolClient并没有增加对应的回调方法会导致原始请求的证书校验代理方法不调用。 暂时无正解。有解决方案的朋友欢迎骚扰。
http://www.yutouwan.com/news/110324/

相关文章:

  • 网站提示域名解析错误怎么办网站建设流程范文
  • 前端做网站如何调接口360免费建站为什么注册不了
  • html网页设计基础网站推广优化开发建设
  • 安徽金鹏建设集团网站做一百度网站
  • 企业网站建设前网站目的需明确wordpress文章无法中文
  • 南京制作网站培训学校微信商城网站哪家做的好
  • 群晖6.1安装wordpress解答网站内容优化策略
  • 做影视网站被告怎么办seo数据优化教程
  • 公司建站服务网站优化 检测响应速度
  • 做网站优化常用工具个人网站可以做资讯吗
  • 花店网站首页模版岳阳网站设计
  • 网页设计素材1000像素个人企业网站快速优化排名
  • 申请个人网站有什么用阿里网站怎么建设
  • 把网站做静态化视频门户网站建设项目标书
  • 做网站的费用记哪个科目电子商务网站管理系统完美版
  • 可以做众筹的网站有哪些做网站的公司需要哪些资质
  • 入门网站分析应该怎么做泰钢材企业网站源码
  • 网站首页确认书天峨县建设局网站
  • 做一个网站建设需要多少钱物流网站建设评析
  • 桂林北站附近住宿合肥网站建设团队
  • 西安网站建设推广专家公司名称可以变更吗
  • 网站设计 西安设计方案包括哪几部分
  • 芜湖网站建设电话淘宝seo搜索引擎原理
  • 口碑好的南京网站建设长春市住房和城乡建设厅网站
  • 做网站用什么软件保存网页的步骤
  • 78建筑网官网aso优化前景
  • 做视频网站 带宽计算网站重定向代码
  • 淘宝客网站免费模板下载广州专业网站
  • 杭州视频网站建设中山 网站建设
  • 湘潭网站建设 磐石网络实惠wordpress视频列表