NSCachedURLResponse returns object, but UIWebView does not interprets content(NSCachedURLResponse 返回对象,但 UIWebView 不解释内容)
问题描述
我正在向 UIWebView 发送请求.加载的网页上有 AJAX 调用.我需要分析 AJAX 流量以确定用户是否登录.为此,我在 AppDelegate 中安装了一个 NSURLCache:
I am sending a request to a UIWebView. There are AJAX-calls on the loaded webpage. I need to analyze the AJAX-traffic in order to determinate, if the user is logged in or not. For doing this I installed a NSURLCache in the AppDelegate:
MYURLCache *cache = [[MYURLCache alloc] init];
[NSURLCache setSharedURLCache:cache];
这个 MYURLCache 类正确接收通过 webview 运行的流量.我只能终止 AJAX 调用.然后我产生一个自己的 AJAX 调用请求.这个返回来自网络服务器的完美响应.所以现在要做的最后一步是构造 NSCachedURLResponse 返回对象.我也管理了这个,但是 webview 在返回对象时根本不做任何事情.如果我只返回 nil,WebView 加载一切正常(nil 是 NSURLCache 的消息,没有缓存,所以 webview 应该开始自己加载它).
This MYURLCache-class correctly receives the traffic that runs through the webview. I can terminate the AJAX-calls only. I then spawn an own request of the AJAX-calls. This one returns the perfectly fine response from the webserver. So the last step to do now is constructing the NSCachedURLResponse return object. I also managed this, but the webview simply does nothing when returning the objects. If I return just nil, the WebView loads everything fine (nil is the message for the NSURLCache, that nothing is cached, so the webview should start to load it on its own).
- (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;
}
推荐答案
我找到了解决这个问题的方法...我认为这与缺少的标题有关.
I found one solution to this problem... I think it has got something to do with the headers that were missing.
如果我替换
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
The whole thing works. This answer in addition suggested the additional custom header of the request. 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];
就我而言,我不需要它.
In my case I did not needed it.
这篇关于NSCachedURLResponse 返回对象,但 UIWebView 不解释内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:NSCachedURLResponse 返回对象,但 UIWebView 不解释内容
				
        
 
            
        基础教程推荐
- navigationItem.backBarButtonItem 不工作?为什么上一个菜单仍然显示为按钮? 2022-01-01
 - 如何将图像从一项活动发送到另一项活动? 2022-01-01
 - SwiftUI-ScrollViewReader的ScrollTo不滚动 2022-01-01
 - Android Volley - 如何动画图像加载? 2022-01-01
 - UIImage 在开始时不适合 UIScrollView 2022-01-01
 - 为什么姜饼模拟器方向卡在应用程序中? 2022-01-01
 - iOS - UINavigationController 添加多个正确的项目? 2022-01-01
 - Play 商店的设备兼容性问题 2022-01-01
 - 如何比较两个 NSDate:哪个是最近的? 2022-01-01
 - Xcode UIView.init(frame:) 只能在主线程中使用 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
				
				
				
				