Наблюдаемость загрузки страницы iOS UIWebView

Я хотел бы знать наверняка, когда загрузка страницы будет завершена в UIWebView. Я знаю о подходе "подсчета ссылок" между didStartLoad/didFinishLoad , описанном здесь и это вроде как работает для меня, но я не очень уверен в этом. Он стал несколько волосатым ifs и все еще ведет себя странно, когда Javascript решает поговорить с document.location. Мне неясно именно следующее:

  1. UIWebViewDelegate при всей мощности, которую он должен поддерживать, он очень лаконичен и имеет за исключением документации. Может ли кто-нибудь подтвердить, что didStartLoad/didFinishLoad действительно вызывается только для «фреймов», что, скорее всего, означает «набор фреймов/фрейм» и «iframe»?
  2. как я могу отличить вышеупомянутые нагрузки, вызванные DOM, от перенаправлений запросов (которые также создают события)?
  3. мое наблюдение состоит в том, что каждому didStartLoad предшествует shouldStartLoadWithRequest, за исключением перенаправлений. Это надежное поведение?
  4. я что-то упустил, или нет никакого способа узнать, какой запрос вызвал конкретное didStartLoad? Поскольку [[webView request] URL] единственного заданного контекста всегда возвращает один и тот же URL-адрес, то есть тот, который UIWebView было предложено загрузить изначально.

person Pavel Zdenek    schedule 11.03.2013    source источник


Ответы (2)


  1. Я не могу.
  2. Я не знаю.
  3. Я не знаю.
  4. Я не могу сказать.

Полезный ответ, правда?

Очевидно, я думаю, что UIWebViewDelegate мог бы (должен?) быть немного более выразительным в отношении того, что происходит в UIWebView.

Мои попытки наблюдать за активностью UIWebView были следующими:

  • добавление наблюдателя при загрузке с iOS 6: наблюдатель никогда не вызывался.
  • пытаясь это:

Примеры методов делегата:

- (void)webViewDidStartLoad:(UIWebView *)webView {
    [self.activityIndicator startAnimating];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (!webView.loading) {
        [self.activityIndicator stopAnimating];
    }
}

который работает довольно хорошо.

Я думаю, вы должны попробовать этот код с трюками JavaScript и iframe, о которых вы упоминаете. Это не помогает, но вы владеете JavaScript, о котором говорите, вы также можете рассмотреть возможность отправки сигналов в свое приложение, чтобы указать, что выполняются дальнейшие действия по загрузке (например, вызов URL-адреса с пользовательской схемой, такой как myApp://didStartLoadingSomethingWithJavascriptDude и myApp://didFinishLoadingSomethingWithJavascriptDude)

person Dirty Henry    schedule 19.03.2013

С UIWebViewNavigationType из shouldStartLoadWithRequest, по крайней мере, вы можете определить, связана ли текущая загрузка с кликом пользователя или с чем-то еще, что произошло на странице. Это не может помочь узнать, когда страница точно загружена, но вы можете запустить некоторый код до того, как пользователь запустит новый. Это может помочь, в зависимости от характера задачи, которую вы должны выполнить между двумя страницами.

person Kiad    schedule 21.10.2013