1

我继承了 NSURLCache 并覆盖– cachedResponseForRequest:– storeCachedResponse:forRequest:. 我将所有文件存储在应用程序的文档目录中。

现在,问题是,.html 文件在打开时不会加载所有资源(即图像、js 和 css)。我不知道问题出在哪里,因此我在同一个网页上做了一个“页面另存为”,并比较了两个 .html 文件(我从浏览器保存的文件和我缓存的文件。)。

发现浏览器保存的html文件中,所有图片等文件源路径都被替换为本地路径了。。

<div><img src="./CNN.com International - Breaking, World, Business, Sports, Entertainment and Video News_files/footer_cnn_logo.png" width="23" height="11" alt="" border="0" class="cnn_ie6png">

但是我缓存的html文件仍然有网站的url..

<div><img src="http://i.cdn.turner.com/cnn/.e/img/3.0/global/footer/pngs/footer_cnn_logo.png" width="23" height="11" alt="" border="0" class="cnn_ie6png"/>

那么我该如何更改它..?或者将网页与所有资源一起保存的正确方法是什么..?

我正在保存所有文件,storeCachedResponse:forRequest:因为它是按原样进行的。那么我是否必须在保存之前对这个 .html 文件进行一些修改,以便它可以正确引用本地文件夹中的所有资源路径??

仅供参考,我不想使用 ASIWebPageRequest (在 ios 上下载并缓存整个网页

//////////// 编辑 ////////////

因此,正如 Edwin Vermeer 所回答的那样,我能够从我的缓存中获取正确的本地文件并返回响应。但看起来, UIWebView 不理解该数据..!这就是在方法中返回响应的cachedResponseForRequest:方式

if (shouldFetchFromCache) {
            NSData* content = [NSData dataWithContentsOfFile:storagePath];

            NSDictionary *headers = @{@"Access-Control-Allow-Origin" : @"*", @"Access-Control-Allow-Headers" : @"Content-Type"};
            NSHTTPURLResponse *urlresponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL statusCode:200 HTTPVersion:@"1.1" headerFields:headers];

            cachedresponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:content];
        }


return cachedresponse;!

这就是网页在 webView 上加载的方式..

应用截图

是否有一些不同的方式来返回响应......?顺便说一句,内容或响应都不是零。

请求 url 的一个例子是

Request : http://z.cdn.turner.com/cnn/tmpl_asset/static/intl_homepage/1021/js/intlhplib-min.js

其存储的文件路径是:

 file path: /Users/akshay/Library/Application Support/iPhone Simulator/5.1/Applications/86ED671C-AE45-449A-A2E1-D08281AB54CF/Documents/CVWebCache/cnn/tmpl_asset/static/intl_homepage/1021/js/intlhplib-min.js
4

1 回答 1

0

如果您的自定义 NSUrlCache 仍然处于活动状态,则对资源的请求应该通过它。您可以在那里测试 URL 并从您的文档文件夹中返回正确的文件。

然后,您还可以打开原始 URL 而不是文档文件夹中的文件。再次,您的 NSUrlCache 将从您的文件夹中返回文件。

您不必创建 NSHTTPUrlResponse。一个 NSURLResponse 就足够了。

 if (shouldFetchFromCache) {
            NSData* content = [NSData dataWithContentsOfFile:storagePath];

            NSURLResponse* response = [[NSURLResponse alloc] initWithURL:request.URL MIMEType:@"cache" expectedContentLength:[content length] textEncodingName:nil] ;

            cachedresponse = [[NSCachedURLResponse alloc] initWithResponse:response data:content];
        }
    }

    return cachedresponse;
于 2013-05-23T10:51:31.763 回答