Как определить, когда UIWebView полностью завершил загрузку?

Я пытаюсь создать фильтр для UIWebView, и я боюсь обнаружить, когда UIWebView полностью завершил загрузку. Я использовал следующие два метода

– webView:shouldStartLoadWithRequest:navigationType:
– webViewDidFinishLoad:

но проблема в том, что они будут вызываться несколько раз, когда на странице есть кадры и дополнительный контент для загрузки.

Мне нужно знать, когда представление полностью загружено, и больше нет содержимого для извлечения. Затем, когда содержимое загружено, я могу проверить URL-адрес страницы по списку утвержденных URL-адресов.

Есть идеи?

Ответ 1

Использовать метод протокола UIWebViewDelegate webViewDidFinishLoad и webView isLoading property

 - (void)webViewDidFinishLoad:(UIWebView *)webView
 {
    //Check here if still webview is loding the content
    if (webView.isLoading)
       return;

    //after code when webview finishes
    NSLog(@"Webview loding finished");
 }

Ответ 2

Версия Swift 3:

func webViewDidFinishLoad(_ webView: UIWebView) {
    if webView.isLoading{
        return
    }
    print("Done loading")
}

Ответ 3

Попробуйте использовать:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)requestURL navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = [requestURL URL];
NSLog(@"##### url = %@",[url absoluteString]); 
return YES;
}

не забудьте установить свой UIWebView Delegate

или добавить выражение,

NSRange range = [[url absoluteString] rangeOfString:@"https://www.google.com"];
if (range.location != NSNotFound)
{}

надеюсь помочь вам.

Ответ 4

Это правда, что исходный вопрос был опубликован много лет назад. Недавно мне пришлось найти надежное решение этой проблемы.

Вот решение, которое сработало для меня:

  1. Заменен UIWebView с помощью WKWebWiew.
  2. Добавлен код "valuJavaScript" при обработке метода делегирования "didFinishNavigation".

Полный код:

   - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
    [webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) {
        if (result != nil) {
            // Call your method here
        }
        if(error) {
            NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
        }
    }];
}

Ответ 5

Если вы не являетесь владельцем UIWebView и в результате у вас нет доступа к webViewDidFinishLoad но у вас есть ссылка на UIWebView вы можете использовать следующий код

Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in

    guard uiWebView.isLoading else {
        return
    }

    timer.invalidate()
    //Add your logic here

}