UIWebView在webViewDidStartLoad之后卡住了

时间:2011-11-03 17:44:18

标签: ios uiwebview webkit

我们的iOS应用程序有一个Web视图,它从文件:URL中呈现页面。当用户触摸<A>元素切换页面时,大约20%的时间会被卡住,如下所示:

  1. 用户点按<A>链接
  2. 我们获得了WebView.shouldStartLoadWithRequest回调
  3. 我们获得了WebView.webViewDidStartLoad回调
  4. 此后没有任何反应
  5. 屏幕仍然显示原始页面,上面有链接。我们可以通过两种方式打破僵局:

    1. 旋转设备
    2. 点按屏幕
    3. 此时,页面将立即完成加载。

      我们使用了这里的食谱:

      Javascript console.log() in an iOS UIWebView

      让我们对页面加载有所了解。我们将javascript端的东西放在我们在页面上加载的第一个脚本文件中,并且在我们执行旋转或点击式解决方法之前它不会打印它的消息。

      所以它似乎在开始加载页面和开始评估页面上的东西之间的某个地方卡住了。

      我们已经尝试了一些解决方法,但没有一个有所帮助:

      • 设置location.href而不是使用标记
      • 从javascript timeout设置location.href
      • 在didStartLoad回调中,创建了一个在webView上反复调用setNeedDisplay的线程

      知道我们可能做错了吗?

2 个答案:

答案 0 :(得分:2)

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

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

我还会在显示你的UIWebView的任何UIViewController中添加一个中断:

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

然后你可以单步执行并希望能够捕获UIWebView子类的错误。

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

GDB Pause Execution Button

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

祝你好运!

答案 1 :(得分:0)

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

在我的App中,我创建了一个UIWebView的子类。我知道Apples文档指出你不应该继承UIWebView。但它必须&#34;在我的应用程序中。

问题是,我已经覆盖了scrollViewDidEndDragging:willDecelerate:没有调用super。

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

变为

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

现在,当点击html链接时,它总是加载网站。