2011-11-03 85 views
4

我们的iOS应用程序具有一个Web视图,它正在渲染来自文件:URL的页面。当用户触摸<A>元素切换页面,时间大约20%,它卡住如下:UIWebView在webViewDidStartLoad后卡住

  1. 用户点击链接<A>
  2. 我们得到WebView.shouldStartLoadWithRequest回调
  3. 我们得到的WebView。 webViewDidStartLoad回调
  4. 没有任何反应后,该

屏幕仍显示与它的联系原来的页面。我们可以打破在两个方面的僵局:

  1. 旋转装置
  2. 点击屏幕

在这一点上,该页面将立即完成加载。

我们所用的配方从这里:

Javascript console.log() in an iOS UIWebView

,让我们一些洞察页面加载。我们将javascript方面的东西放在我们加载到页面上的第一个脚本文件中,并且在我们执行旋转或分接点解决方法之后才会打印它的消息。

所以看起来,它开始加载页面,并开始评估页面上的东西之间的某处。

我们已经尝试了一些变通,其中没有帮助:

  • 设置location.href,而不是使用标签
  • 从设置location.href JavaScript的超时
  • 在didStartLoad回调,创建了一个线程,在webView上反复调用setNeedDisplay

任何想法我们可能会做错什么?

+0

你能评论一下网页上的所有内容,或者大部分内容,但是仍然会重现问题吗?那将是我第一个诊断的方法。也许这是一个页面大小/内存问题。如果有应用程序内存错误,你是NSLog吗? –

+0

在我的应用程序中同样奇怪的行为。你找到了解决方案吗? – olfuerniss

+0

还没有答案,尽管我很高兴我们并不孤单。我已经看到了完全无关紧要的页面的问题,正如我所说的,我们已经尝试在我们要开始的页面的开头添加日志记录,但这并未发生。所以webkit已经离开了旧页面并开始加载新页面,但在解析任何内容之前就停止了。 –

回答

2

您可以在XCode中使用gdb来调试问题。我认为,可能有断点的消息canidates是:

- (void)webViewDidStartLoad:(UIWebView *)webView 
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 

我也想补充一个破发以任何UIViewController是显示您的UIWebView为:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

然后,你可以通过一步,并希望赶上你的UIWebView子类有什么问题。

如果您不想添加断点,则只需在XCode调试器中运行您的应用程序,并在应用程序加载时无响应时点击控制台窗口上方的“暂停执行”按钮即可。

GDB Pause Execution Button

很难知道发生了什么事情,没有任何代码走下车,但我打赌的Xcode可以帮助你快速找到问题。

祝你好运!

+0

这是我们需要的线索。我们发现UIWebView和我们的Open GL渲染代码之间存在着一种软性的僵局(我们通过一个opengl图像对Web视图进行分层)。 Web视图挂起来等待信号量。 我们通过简单地关闭页面加载期间的GL刷新循环来解决问题。 –

0

找到了这种奇怪行为的解决方案,至少在我的情况下。

在我的应用程序中,我创建了UIWebView的子类。我知道苹果文档指出你不应该继承UIWebView。但它在我的应用程序中是“必要的”。

问题是,我覆盖了scrollViewDidEndDragging:willDecelerate:没有调用超级。

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
    // my code 
} 

变得

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
    [super scrollViewDidEndDragging:scrollView willDecelerate:decelerate]; 
    // my code 
} 

现在,它始终是一个HTML链接上敲击时加载的网站。

+0

我们对UIWebView进行了子类化,但我们并没有重写该方法。无论如何,我们只是重构,以消除子类(没有意识到这是一个“不应该”)。问题依然存在。 –