我已经编写了 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/