UIWebview在控制台中遇到以下消息

UIWebview在控制台中遇到以下消息。

void SendDelegateMessage(NSInvocation*): delegate (webView:didFinishLoadForFrame:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode 

任何人都知道这是什么?

您正在加载的页面上使用任何Javascript吗?

具体来说,你使用的方法

 - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script 

正如文档所述

每个顶级入口点的JavaScript执行时间被限制为10秒。 如果您的脚本执行超过10秒,则Web视图停止执行脚本

这似乎与您在控制台中看到的错误消息一致

FWIW,它看起来像我特殊的超时是由于在极less数情况下的JavaScript错误发生。 你可以尝试在一个try / catch中包装你的JS,或者改进它以使其更容错。


更多细节:我正在使用下面的JSstring:

 NSString* js = @"document.getElementById(\"main\").offsetHeight"; int height = [[_web_view stringByEvaluatingJavaScriptFromString:js] intValue]; 

我知道这个UIWebView的问题可能发生,如果Web视图没有完全加载(例如JS调用之前的webViewDidFinishLoad:方法,所以我猜想,也许是“主要”的对象丢失。因此,我修改我的JS到以下有效:

 NSString* js = @"document.getElementById(\"main\") ? document.getElementById(\"main\").offsetHeight : -1"; 

下面的代码片段为我工作。

 if(!webview.isLoading) { // update your code. } 

尝试使用WKWebView而不是UIWebView.this为我工作。

在我的情况下,我尝试使用UIWebView打开本地PDF。一些PDF可能包含一些JS代码。然后我遇到了这个问题。

使用WKWebView后,一切正常完美

如果您的应用程序在iOS 8及更高版本中运行,Apple还build议您使用WKWebView