【问题标题】:In UIWebView, how to forcibly cache resources that are 'Pragma:no-cache'?在 UIWebView 中,如何强制缓存 'Pragma:no-cache' 的资源?
【发布时间】:2016-01-17 05:09:59
【问题描述】:

我正在将火车时刻表 URL 加载到 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 方法。

【问题讨论】:

    标签: ios objective-c caching uiwebview nsurlcache


    【解决方案1】:

    你对缓存本身做了什么并不重要,因为它从一开始就永远不会到达 NSURLCache 类。 HTTP/HTTPS 的默认 URL 协议缓存策略是阻止它被缓存。

    要使用 UIWebView 缓存此类请求,首先实现并注册一个自定义 NSURLProtocol 对象,如下所示:

    • 在您的 startLoading 方法中,创建原始 URL 请求的可变副本,并向该可变请求添加自定义标头。您给标头提供什么名称或给它提供什么字符串值都没有关系,只要您选择的名称不太可能出现在您收到的任何请求的任何真实标头中即可。 (换句话说,将其命名为“x-mycustomprotocoltag-watermelon”,仅比这更具描述性。)

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

    • 在您的协议类中,实现 connection:willCacheResponse: 委托方法,并在该方法中自己创建一个 NSCachedURLResponse 对象并返回它。 p>

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-17
      • 2019-01-19
      • 2020-03-28
      • 1970-01-01
      • 2010-09-25
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多