UIWebview застрял со следующим сообщением в консоли

UIWebview застрял со следующим сообщением в консоли.

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

Кто-нибудь знает, что это такое?

Ответы

Ответ 1

Используете ли вы какой-либо Javascript на странице, которую вы загружаете?

В частности, используете ли вы метод

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

Как docs укажите следующие

Время выполнения JavaScript ограничено 10 секундами для каждой точки входа верхнего уровня. Если ваш script выполняется более 10 секунд, веб-просмотр прекращает выполнение script

И это, похоже, связано с сообщением об ошибке, которое вы видите на консоли

Ответ 2

FWIW, похоже, что мой конкретный тайм-аут произошел из-за ошибки javascript в редких сценариях. Вы можете попробовать объединить JS в try/catch или улучшить его, чтобы быть более устойчивым к ошибкам.


Подробнее: Я использовал следующую строку JS:

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

Я знал, что эта проблема с UIWebView может произойти, если веб-представление не было полностью загружено (например, JS, вызываемый до метода webViewDidFinishLoad:, поэтому я догадался, что, возможно, "основной" объект отсутствует. Таким образом, я изменил свой JS на следующее и это сработало:

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

Ответ 3

Ниже фрагмент кода работал у меня.

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

Ответ 4

Попробуйте использовать WKWebView вместо UIWebView.this работает для меня.

В моем случае я пытаюсь использовать UIWebView для открытия локального PDF. Некоторые из файлов PDF могут содержать некоторые JS-коды. Затем я сталкиваюсь с этой проблемой.

После использования WKWebView все работает просто отлично

Apple также рекомендует использовать WKWebView, если ваше приложение, работающее в iOS 8 и более поздних версиях