NSCachedURLResponse返回对象,但UIWebView不解释内容

时间:2013-03-06 09:50:58

标签: ios objective-c uiwebview nsurlcache

我正在向UIWebView发送请求。加载的网页上有AJAX调用。我需要分析AJAX流量,以便在用户登录时确定。为此,我在AppDelegate中安装了一个NSURLCache:

MYURLCache *cache = [[MYURLCache alloc] init];
[NSURLCache setSharedURLCache:cache];

此MYURLCache类正确接收通过webview运行的流量。我只能终止AJAX调用。然后我产生了一个自己的AJAX调用请求。这个返回来自网络服务器的完美回复。所以现在要做的最后一步是构建NSCachedURLResponse返回对象。我也管理过这个,但是webview在返回对象时什么都不做。如果我只返回nil,则WebView会加载所有内容(nil是NSURLCache的消息,没有任何内容被缓存,因此webview应该开始自己加载它。)

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {
    if ([[[request URL] absoluteString] rangeOfString:@"/ajax/"].location == NSNotFound) {
        return nil;
    } else {

    ASIHTTPRequest *asirequest = [ASIHTTPRequest requestWithURL:[request URL]];
    [asirequest setValidatesSecureCertificate:NO];
    [asirequest startSynchronous];
    NSError *error = [asirequest error];
    NSData* data = [[asirequest responseString] dataUsingEncoding:NSUTF8StringEncoding];

    // Create the cacheable response
    NSURLResponse *urlresponse = [[NSURLResponse alloc] initWithURL:[request URL] MIMEType:@"application/json" expectedContentLength:[data length] textEncodingName:@"UTF-8"];
    NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:data];

    NSLog(@"cachedResponse %@", cachedResponse);
    NSLog(@"cachedResponse data %@", [[NSString alloc] initWithData:[cachedResponse data] encoding:NSUTF8StringEncoding]);

    return cachedResponse;
}  

return nil;
}

1 个答案:

答案 0 :(得分:8)

我找到了一个解决这个问题的方法......我认为这与丢失的标题有关。

如果我更换

NSURLResponse *urlresponse = [[NSURLResponse alloc] initWithURL:[request URL] MIMEType:@"application/json" expectedContentLength:[data length] textEncodingName:@"UTF-8"];
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:data];

使用

NSHTTPURLResponse *urlresponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL statusCode:200 HTTPVersion:@"1.1" headerFields:nil];
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:data];

整个事情都有效。此答案另外建议了请求的附加自定义标头。 https://stackoverflow.com/a/15234850/274518

NSDictionary *headers = @{@"Access-Control-Allow-Origin" : @"*", @"Access-Control-Allow-Headers" : @"Content-Type"};
NSHTTPURLResponse *urlresponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL statusCode:200 HTTPVersion:@"1.1" headerFields:headers];

就我而言,我并不需要它。