【问题标题】:NSURL Caching issuesNSURL 缓存问题
【发布时间】:2013-10-11 14:46:21
【问题描述】:

我遇到了登录 API 的问题。第一次调用工作正常,但后续调用被缓存。这导致了一个问题,因为登录/注销功能基本上被破坏了。

我尝试了很多方法,我正在实现 AFNetworking 库。

AppDelegate.m:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
                                                        diskCapacity:0
                                                            diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];

在我的网络课程中:

 (AFHTTPRequestOperation *)createRequestOperationWithMethod:(NSString *) method andPath:    (NSString *)path andParams:(NSDictionary *)params
{
  GRAPIClient *httpClient = [GRAPIClient sharedClient];
  [httpClient setParameterEncoding:AFFormURLParameterEncoding];
  NSMutableURLRequest *request = [httpClient requestWithMethod:method
                                                 path:path
                                           parameters:params];

  [request setCachePolicy:NSURLRequestReloadIgnoringCacheData]

  AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
return operation;

}

我什至试图覆盖在 AFHTTPClient 中生成的请求

在 AFHTTPClient.m 中:

[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[request setTimeoutInterval:2.0];

我的 GRAPIClient 实现:

@interface GRAPIClient : AFHTTPClient

+ (GRAPIClient *)sharedClient;
+ (BOOL) isInternetReachable;

@end

@implementation GRAPIClient

+ (BOOL) isInternetReachable
{
    return reachable;
}

+ (GRAPIClient *)sharedClient {
    static GRAPIClient *_sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedClient = [[GRAPIClient alloc] initWithBaseURL:[NSURL    URLWithString:kAFAppDotNetAPIBaseURLString]];
});

[_sharedClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    if (status == AFNetworkReachabilityStatusReachableViaWWAN ||
        status == AFNetworkReachabilityStatusReachableViaWiFi ) {
        NSLog(@"Reachable on!");
        reachable = YES;
    }
    else
    {
        NSLog(@"Reachable off!");
        reachable = NO;
    }
}];

return _sharedClient;
}

- (id)initWithBaseURL:(NSURL *)url {
    self = [super initWithBaseURL:url];
    if (!self) {
        return nil;
    }

    [self registerHTTPOperationClass:[AFJSONRequestOperation class]];    
// Accept HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
[self setDefaultHeader:@"Accept" value:@"application/json"];
    return self;
}
@end

我已经调试了来自服务器的响应,并测试了同时将两个 NSURLRequest 硬编码到服务器。一个给用户 A,一个给用户 B,然后打印两个用户的响应数据。

第一次登录时,用户 A 登录返回用户 A 凭据。用户 B 返回了用户 B 凭据。在第二次登录时,用户 A 返回用户 A 凭据,用户 B 返回用户 A 凭据。我不知道如何完全禁用缓存。

【问题讨论】:

  • 您是否 100% 认为这是由缓存引起的? GRAPIClient 会不会有问题?
  • 我相信这是由缓存引起的,因为 GRAPIClient 是 AFHTTPClient 的简单扩展。我更新了代码以显示 GRAPIClient 是如何实现的
  • 另一件需要注意的事情:服务器端的会话。 URL 加载系统透明地处理 cookie,因此如果您的第一次登录建立了会话(并设置了会话 ID cookie),您后续尝试的结果可能会受到影响。如果您不使用 Charles 之类的工具窥探实际的 HTTP 流量,我也建议您这样做。
  • 我很确定这里没有缓存。
  • @SixtenOtto 我们正在使用一个不安定的 API,没有任何依赖于 Auth Tokens 的 cookie。但是,由于登录时没有身份验证令牌可以传入,我们真的不应该在服务器端进行会话。不过我会看看查尔斯!

标签: objective-c


【解决方案1】:

试试:

[operation setCacheResponseBlock:^NSCachedURLResponse*(NSURLConnection* connection, NSCachedURLResponse* cachedResponse) {
    return nil;
}];

还有:

[request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData];

【讨论】:

  • 感谢您的帮助!不幸的是,这是一个服务器问题(我希望不是这样)。我正在为发生在我身上的事情添加一个答案
【解决方案2】:

SixteenOtto 建议我的问题是从服务器发送会话,AFNetworking 自动使用 cookie。我之前没有考虑过这一点,因为我们使用的是基于身份验证令牌的不安定 API,因此会话的 cookie 没有意义。但是,与 Charles 一起检查 HTTP 响应标头让我看到了这一点。

添加

[request setHTTPShouldHandleCookies:NO];

我的operation 生成器解决了这个问题。

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 2011-08-12
    • 2015-12-25
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2011-10-30
    相关资源
    最近更新 更多