针对HTTP GET请求的缓存不适用于iOS 6

问题描述:

我写了hello word应用程序以显示我的HTTP GET请求缓存问题。针对HTTP GET请求的缓存不适用于iOS 6

#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 

的AppDelegate:

#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的作品没有任何问题超时。有头发送和从服务器接收:

第一个请求:

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 

第一反应:

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: 

你知道是怎么回事?

+0

你有没有实施'连接:didReceiveData:'? –

+0

@AaronBrager我在演示中添加了'didReceiveData'。我没有改变任何东西。我还从控制台添加了日志。 – Tomasz

第二个响应头中有一件事是状态码,它是304 Not Modified。据Apple

作为一项规则,响应缓存只有当以下所有的都是 真正

  • 的请求是针对HTTP或HTTPS URL(或您自己的自定义网络协议,它支持缓存)。

  • 请求成功(状态码在200-299范围内)。

  • 提供的响应来自服务器,而不是缓存。

  • 会话配置的缓存策略允许缓存。

  • 提供的NSURLRequest对象的缓存策略(如果适用)允许缓存。

  • 服务器响应(如果存在)中与缓存相关的标头允许缓存。 响应大小足够小,可合理地放入缓存中。 (例如,如果您提供的磁盘高速缓存,响应必须 不超过磁盘高速缓存大小的约5%以下。)