ios - HTTP GET 请求的缓存不适用于 iOS 6

标签 ios caching ios6

我已经编写了 hello word 应用程序来展示我的 HTTP GET 请求缓存问题。

#import "StartViewController.h"

@interface StartViewController () <NSURLConnectionDataDelegate>

@property (nonatomic, strong) NSURLConnection *connection; @end

@implementation StartViewController

- (IBAction)buttonAction:(id)sender {
    NSLog(@"buttonAction");
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://mycoolpage.com/phones"] ];
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self ]; }

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"didReceiveResponse"); }

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"didReceiveData:"); }


- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
    NSLog(@"willCacheResponse");
    return cachedResponse; }

@end

应用委托(delegate):

#import "AppDelegate.h"
#import "StartViewController.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [[StartViewController alloc] init];

    [self.window makeKeyAndVisible];

    NSURLCache *defaultCache = [NSURLCache sharedURLCache];
    NSURLCache *applicationCache = [[NSURLCache alloc] initWithMemoryCapacity:defaultCache.memoryCapacity diskCapacity:128*1024*1024 diskPath:@"MobileCache"];
    [NSURLCache setSharedURLCache:applicationCache];

    return YES;
}

@end

第一次发送请求时,一切正常,但第二次调用在 ios 6 上超时。iOS 7 没有任何问题。有从服务器发送和接收的 header :

第一个请求:

GET /phones HTTP/1.1
Host    mycoolpage.com
Accept-Encoding gzip, deflate
Accept  */*
Accept-Language en-us
Connection  keep-alive
User-Agent  CacheDemo/1.0 CFNetwork/609 Darwin/13.1.0

第一 react :

HTTP/1.1 200 OK
Cache-Control   private, max-age=0
Content-Encoding    gzip
Content-Type    application/json; charset=UTF-8
Date    Fri, 28 Feb 2014 14:28:24 GMT
ETag    afcf39d75c69c694f4dfaca7f20b816b
Content-Length  28578
Connection  keep-alive

第二个请求:

GET /phones HTTP/1.1
Host    mycoolpage.com
If-None-Match   afcf39d75c69c694f4dfaca7f20b816b
Accept-Encoding gzip, deflate
Accept  */*
Accept-Language en-us
Connection  keep-alive
User-Agent  CacheDemo/1.0 CFNetwork/609 Darwin/13.1.0

第二个回复:

HTTP/1.1 304 Not Modified
Cache-Control   private, max-age=0
Content-Encoding    gzip
Content-length  22
Content-Type    text/plain; charset=UTF-8
Date    Fri, 28 Feb 2014 14:29:15 GMT
ETag    afcf39d75c69c694f4dfaca7f20b816b
Connection  keep-alive

这里是来自控制台的日志:

2014-03-02 16:58:29.054 CacheDemo[6834:907] buttonAction
2014-03-02 16:58:29.286 CacheDemo[6834:907] response:<NSHTTPURLResponse: 0x784a2f0>
2014-03-02 16:58:29.286 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.287 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.351 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.352 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.352 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.353 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.353 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.354 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.355 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.356 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.356 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.356 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.415 CacheDemo[6834:907] didReceiveData:
2014-03-02 16:58:29.416 CacheDemo[6834:907] willCacheResponse
2014-03-02 16:58:35.095 CacheDemo[6834:907] buttonAction
// Timeout after 1 min
2014-03-02 16:59:34.754 CacheDemo[6834:907] response:<NSHTTPURLResponse: 0x766a710>
2014-03-02 16:59:34.754 CacheDemo[6834:907] didReceiveData:

你知道这是怎么回事吗?

最佳答案

第二个响应 header 中的一个不同之处是状态代码,它是 304 Not Modified。根据Apple :

As a rule, responses are cached only when all of the following are true

  • The request is for an HTTP or HTTPS URL (or your own custom networking protocol that supports caching).

  • The request was successful (with a status code in the 200–299 range).

  • The provided response came from the server, rather than out of the cache.

  • The session configuration’s cache policy allows caching.

  • The provided NSURLRequest object's cache policy (if applicable) allows caching.

  • The cache-related headers in the server’s response (if present) allow caching. The response size is small enough to reasonably fit within the cache. (For example, if you provide a disk cache, the response must be no larger than about 5% of the disk cache size.)

关于ios - HTTP GET 请求的缓存不适用于 iOS 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22098124/

相关文章:

cakephp - CakePHP写入缓存时偶尔出现错误警告

iphone - Scrollview 滚动动态图像和垂直/水平滚动,但一次一个

ios - iOS 界面生成器中的 float 布局?

ios - CoreData - 删除托管对象内的对象

java - 如何使 Spring 缓存中的条目每小时失效?

caching - 为什么大家都建​​议避免在 Play 2.x 中使用 EHCache 作为分布式缓存?

ios - iOS会显示弹出窗口以更新到最新的iOS吗?

objective-c - IOS 中的圆形进度条

ios - 有没有更简单的方法来更改应用程序 ID 和名称?

ios - 导航 Controller 内的选项卡栏 Controller ,如何将新的 View Controller 推送到选项卡 Controller ?