【问题标题】:UIWebView getting stuck after webViewDidStartLoadUIWebView 在 webViewDidStartLoad 后卡住
【发布时间】:2011-12-21 10:03:06
【问题描述】:

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

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

屏幕仍然显示带有链接的原始页面。我们可以通过两种方式打破僵局:

  1. 旋转设备
  2. 点击屏幕

此时,页面将立即完成加载。

我们使用了这里的食谱:

Javascript console.log() in an iOS UIWebView

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

所以它似乎在开始加载页面和开始评估页面上的内容之间卡住了。

我们尝试了许多解决方法,但都没有帮助:

  • 设置 location.href 而不是使用标签
  • 从 javascript 超时设置 location.href
  • 在 didStartLoad 回调中,创建了一个线程,一遍又一遍地在 webView 上调用 setNeedDisplay

知道我们可能做错了什么吗?

【问题讨论】:

  • 您能否注释掉页面上的所有内容或大部分内容,但仍然会出现问题?那将是我的第一种诊断方法。也许这是页面大小/内存问题。如果出现应用程序内存错误,您是否 NSLog'ging?
  • 我的应用程序中出现了同样的奇怪行为。你找到解决办法了吗?
  • 还没有答案,尽管我很高兴我们并不孤单。我已经看到了完全微不足道的页面的问题,正如我所说,我们已经尝试在我们要访问的页面的开头添加日志记录,但没有发生。所以 webkit 已经离开旧页面并开始加载新页面,但在解析任何内容之前就停止了。

标签: ios uiwebview webkit


【解决方案1】:

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

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

问题是,我已经覆盖了 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 链接时加载网站。

【讨论】:

  • 我们继承了 UIWebView,但我们并没有覆盖那个方法。无论如何,我们只是重构以消除子类化(没有意识到这是“不应该”)。问题依然存在。
【解决方案2】:

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

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

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

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

然后您可以逐步检查并希望发现您的 UIWebView 子类有什么问题。

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

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

祝你好运!

【讨论】:

  • 这是我们需要的线索。我们发现在 UIWebView 和我们的 Open GL 渲染代码之间存在一种软死锁(我们在 opengl 图像上分层了一个 Web 视图)。 Web 视图挂起等待信号量。我们通过在页面加载期间关闭我们的 GL 刷新循环来解决此问题。
猜你喜欢
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
相关资源
最近更新 更多