欢迎来到天天文库
浏览记录
ID:34723576
大小:53.98 KB
页数:6页
时间:2019-03-10
《iosuiwebviewurl拦截》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、iOSUIWebViewURL拦截译者在做app开发时,因为页面的javascript文件比较大导致加载速度很慢,所以想把javascript文件打包在app里,当UIWebView需要加载该脚本时就从app本地读取,但UIWebView并不支持加载本地资源。最后从下文中找到了解决方法,第一次翻译,难免有误,大家多多指教。iCabMobile(一款iOS平台的网页浏览器)要实现一个拦截管理器来过滤页面上的广告及其他东西。它有一个简单的基于URL过滤规则的列表(通常由用户维护),当页面包含的资源(图片、js以及css等),文件的URL存在于规则列表中时,资源就不会
2、被加载。但看一下UIWebView类的API,会发现我们没有办法知道UIWebView正在加载什么资源,更糟的是,当你希望过滤掉某些资源文件的时候,没有方法可以强制UIWebView不去加载这些文件,拦截器看起来貌似没有可能实现。当然还是有解决方案的,否则这篇文件就没什么卵用。正如上面所说,实现拦截器不能靠UIWebView,因为UIWebView没有提供任何有用的API。对UIWebView的所有请求,要找到一个能中断所有HTTP请求的切入点,我们需要先了解一下Cocoa的URLLoadingSystem,因为UIWebView是使用URLLoadingSys
3、tem从web端取数据的。我们需要的切入点NSURLCache类就是URLLoadingSystem的一部分。虽然目前iOS系统不会在磁盘上缓存任何数据(后面的iOS系统版本或许会有不同),因此在UIWebView开始加载前,NSURLCache管理的缓存数据通常为空,但UIWebView仍然会检测所请求资源文件是否存在于缓存。所以我们需要做的只是继承NSURLCache并重载其方法: 1.- (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request UIWebView请求所有资源
4、时都会调用这个方法。因为我们只需要在这个方法里判断请求的URL是否是我们想拦截的。如果是则创建一个没有内容的假response,否则只需调用super方法即可。如下是实现细节:1.继承NSURLCache:FilteredWebCache.h:1.@interface FilteredWebCache : NSURLCache 2.{ 3.} 1.@end 子类的主要代码FilteredWebCache.m:1.#import "FilteredWebCache.h" 2.#import "FilterManager.h" 3.@implementation F
5、ilteredWebCache 4.- (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request 5.{ 6.NSURL *url = [request URL]; 7.BOOL blockURL = [[FilterMgr sharedFilterMgr] shouldBlockURL:url]; 8.if (blockURL) { 9.NSURLResponse *response = 10.[[NSURLResponse alloc] initWithURL:url 11.M
6、IMEType:@"text/plain" 12.expectedContentLength:1 13.textEncodingName:nil]; 14.NSCachedURLResponse *cachedResponse = 15.[[NSCachedURLResponse alloc] initWithResponse:response 1.data:[NSData dataWithBytes:" " length:1]]; 2.[super storeCachedResponse:cachedResponse forRequest:request];
7、3.[cachedResponse release]; 4.[response release]; 5.} 6.return [super cachedResponseForRequest:request]; 7.} 8.@end 首先判断URL是否需拦截(判断通过FilterManager类实现,类实现在此不列出)。如果需要,创建一个无内容的响应对象并把它存在cache中。有人可能会认为只需要返回假的响应对象就够了,没必要缓存它。但这样会因响应对象被系统释放而导致appcrash。不知道为何为会这样,可能是iOS的bug(MacOSX10.5.x也存在同样问题
8、,而10.4.x及更早的
此文档下载收益归作者所有