Как я могу узнать URL-адрес, по которому пользователь нажал во время загрузки страницы?

#ios #objective-c #uiwebview

#iOS #objective-c #uiwebview

Вопрос:

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

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
  

Но, как показали некоторые из моих экспериментов, этот метод вызывается с помощью UIWebViewNavigationTypeLinkClicked более одного раза для одной и той же страницы.

Например, попробуйте записать этот путь:

  1. Перейдите к google.com .
  2. Найдите «Нью-Йорк таймс».
  3. Нажмите на первую ссылку.

На шаге (3) делегат get вызывается 3 раза! с помощью UIWebViewNavigationTypeLinkClicked. Во-первых, когда вы нажимаете на ссылку, чтобы перейти к nytimes.com из Google, а затем еще два раза, пока он загружается. В здравом уме!

Для этого я дошел до крайности. Я переделал весь свой проект в iOS 8, надеясь, что новый WKWebView предоставит решение, но оказалось, что оно работает так же.

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

Вот оно:

Когда вы нажимаете на ссылку, чтобы перейти на другую страницу, делегат get вызывается с помощью этого метода:

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

Ошибка:

 "The operation couldn’t be completed.” (-999)
  

Последняя ссылка, которую UIWebView загружает перед выдачей ошибки, — это новая ссылка, по которой пользователь нажал. Итак, если вы сохраняете каждую ссылку, загружаемую UIWebView, в переменной с именем lastURL, вы можете использовать lastURL в качестве URL-адреса новой страницы.

Меня беспокоят две вещи:

  1. Вызываемый делегат get сообщает об ошибке с небольшой задержкой, позволяя загружать несколько подкадров новой веб-страницы, в результате чего lastURL сохраняет URL-адрес некоторого подкадра новой ссылки, а не фактическую новую ссылку.

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

Есть ли более надежный способ? Мне все равно, работает ли ваш способ для iOS 7 или iOS 8.