iOS 7 UIWebView 304缓存bug,空白页面

我在我的应用程序中发现了一个有UIWebView的问题. iOS 7缓存空白主体304响应,导致在用户刷新UIWebView时显示空白页面.这不是很好的用户体验,我试图弄清楚如何在iOS端解决这个问题,因为我无法控制Amazon S3如何响应标头(这是我用于资源托管的人).

这些人发现了这个bug的更多细节:http://tech.vg.no/2013/10/02/ios7-bug-shows-white-page-when-getting-304-not-modified-from-server/

我很感激任何帮助,我可以在应用程序方面而不是服务器方面解决这个问题.

谢谢.

更新:使用赏金的建议作为指导来修复此错误:

@property (nonatomic,strong) NSString *lastURL;

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    if ([self.webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"].length < 1)
    {
        NSLog(@"Reconstructing request...");
        NSString *uniqueURL = [NSString stringWithFormat:@"%@?t=%@",self.lastURL,[[NSProcessInfo processInfo] globallyUniqueString]];
        [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:uniqueURL] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:5.0]];
    }
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    self.lastURL = [request.URL absoluteString];
    return YES;
}

解决方法

由于其他问题是每次都使用NSURLConnection,这似乎有点开销:
为什么不在页面加载(完整或不完整)之后执行一个小的javascript,它可以告诉你页面是否实际显示?查询应该在那里的标签(比如你的内容div)并使用.给出一个真/假
[UIWebView stringByEvaluatingJavaScriptFromString:@"document.getElementById('adcHeader')!=null"]

然后,如果返回false,您可以使用您自己描述的缓存断开器技术手动重新加载URL:

NSString *uniqueURL = [NSString stringWithFormat:@"%@?t=%d",self.url,[[NSDate date] timeIntervalSince1970]]; 
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:uniqueURL] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:5.0]];

[编辑]

根据评论中的讨论和其他一些答案,我认为您可能有手动更改NSURLCache的最佳解决方案.

从我收集的内容来看,您主要是尝试解决重新加载/重新安装方案.在这种情况下,如果存在正确的响应,则查询NSURLCache,如果没有,则在重新加载UIWebView之前删除storedvalue.

[编辑2]

根据您的新结果,尝试在NSURLCache损坏时删除它:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache]cachedResponseForRequest:request];

  if (cachedResponse != nil && [[cachedResponse data] length] > 0)
  {
      NSLog(@"%@",cachedResponse.response);
  } else {
    [[NSURLCache sharedURLCache] removeCachedResponseForRequest:request];
  }

  return YES;
}

如果缓存再次无效,我们可能必须优化检查,但理论上这应该可行!

以上是来客网为你收集整理的iOS 7 UIWebView 304缓存bug,空白页面全部内容,希望文章能够帮你解决iOS 7 UIWebView 304缓存bug,空白页面所遇到的程序开发问题。

如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。