在UIWebView中,如何强制缓存“Pragma:no-cache'?

时间:2015-10-18 23:39:28

标签: ios objective-c caching uiwebview nsurlcache

我将列车时刻表网址加载到UIWebView。刷新速度很慢,因为页面膨胀与站点范围内的CSS,JS,图像以及其响应标头设置为

的其他资源完全相信
Cache-Control:no-cache, no-store, must-revalidate
Pragma:no-cache

但有

Last-Modified:Wed, 30 Apr 2014 02:48:09 GMT

即使有了

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
                                                     diskCapacity:30 * 1024 * 1024
                                                         diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];

这些资源没有被缓存。

问题我想知道如何缓存这些资源,尽管它们的响应标头除了列车时间表HTML(应该被缓存)。或者,我希望NSlog加载资源。我使用的是标准UIWebViewUIWebViewDelegate方法。

1 个答案:

答案 0 :(得分:-1)

你对缓存本身做了什么并不重要,因为它从不首先到达NSURLCache类。 HTTP / HTTPS的默认URL协议缓存策略阻止缓存它。

要使用 UIWebView 缓存此类请求,请首先按如下方式实现并注册自定义 NSURLProtocol 对象:

  • startLoading 方法中,创建原始URL请求的可变副本,并为该可变请求添加自定义标头。只要您选择的名称不太可能出现在您收到的任何请求中的任何真实标题中,那么您为标题指定的名称或您提供的字符串值无关紧要。 (换句话说,将它命名为“x-mycustomprotocoltag-watermelon”,只是描述性更强。)

    添加自定义标头后,创建 NSURLConnection 对象,将协议对象指定为连接的委托,然后再次发出URL请求。

  • 在您的协议类中,实现 connection:willCacheResponse:委托方法,并在该方法中自行创建 NSCachedURLResponse 对象并将其返回。

  • canInitWithRequest:方法中,检查自定义标头,如果看到它,请返回NO,这样您就不会无限制地处理请求。同样,如果它不是HTTP或HTTPS请求,则返回NO。否则,返回YES。