iosuiwebviewurl拦截

iosuiwebviewurl拦截

ID:34723576

大小:53.98 KB

页数:6页

时间:2019-03-10

iosuiwebviewurl拦截_第1页
iosuiwebviewurl拦截_第2页
iosuiwebviewurl拦截_第3页
iosuiwebviewurl拦截_第4页
iosuiwebviewurl拦截_第5页
资源描述:

《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及更早的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。