针对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:
你知道是怎么回事?
答
第二个响应头中有一件事是状态码,它是304 Not Modified
。据Apple:
作为一项规则,响应缓存只有当以下所有的都是 真正
的请求是针对HTTP或HTTPS URL(或您自己的自定义网络协议,它支持缓存)。
请求成功(状态码在200-299范围内)。
提供的响应来自服务器,而不是缓存。
会话配置的缓存策略允许缓存。
提供的NSURLRequest对象的缓存策略(如果适用)允许缓存。
服务器响应(如果存在)中与缓存相关的标头允许缓存。 响应大小足够小,可合理地放入缓存中。 (例如,如果您提供的磁盘高速缓存,响应必须 不超过磁盘高速缓存大小的约5%以下。)
你有没有实施'连接:didReceiveData:'? –
@AaronBrager我在演示中添加了'didReceiveData'。我没有改变任何东西。我还从控制台添加了日志。 – Tomasz