UIWebView NSURLCache加载离线数据

时间:2016-12-21 02:10:25

标签: ios objective-c

我已经看过几个关于这个问题的帖子,我无法弄清楚如何使这个工作。例如,这篇文章NSCachedURLResponse returns object, but UIWebView does not interprets content

建议我们继承并覆盖cachedResponseForRequest并在返回缓存响应之前修改NSURLRequest(不确定为什么需要这样做)。

这是我在NSURLCache子类中的代码:

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {

    NSCachedURLResponse *resp = [super cachedResponseForRequest:request];
    if (resp != nil && resp.data.length > 0) {
        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];
        NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:resp.data];
        return cachedResponse;
    } else {
        return nil;
    }

}

现在,当我通过webview加载请求并且我处于脱机状态时,委托didFailLoadWithError被调用(无法加载),但在调用该委托方法之前,我的cachedResponseForRequest方法被调用,缓存的响应有一些html,但我的didFailLoadWithError方法仍然被调用。所以我的问题是,如果我们从webViewDidFinishLoad返回缓存的响应,是否应调用NSURLCache,如果不是,我该如何使其工作?

我在didFinishLaunchingWithOptions

中有这个
NSUInteger cacheSizeMemory = 500*1024*1024; // 500 MB
NSUInteger cacheSizeDisk = 500*1024*1024; // 500 MB
NSURLCache *sharedCache = [[CustomCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
[NSURLCache setSharedURLCache:sharedCache];

这是我想要的工作流程:

  1. 启动应用。
  2. 点击一些网址(比如说slickdeals.net)
  3. 离线杀死应用程序
  4. 启动应用程序
  5. UIWebView尝试点击网址,但设备处于离线状态,并返回返回的缓存响应。
  6. 我们显示缓存的响应。
  7. 对我的代码中需要更改的内容的任何想法都表示赞赏!

1 个答案:

答案 0 :(得分:0)

NSURLCache专为HTTP一致性缓存而设计,并且通常表现得很意外。您必须为您的用例编写自己的缓存,并实现自定义NSURLProtocol以使用它。该协议将响应放入缓存中,并在脱机时从缓存中提供它们。 Rob Napier对此问题excellent article