Как отличить запросы, поступающие от LoadHtmlString от запросов веб-страницы в событии ShouldStartLoad? - PullRequest
0 голосов
/ 20 августа 2011

Я встроил автономную функциональность в свой UIWebView, чтобы загруженные страницы оставались доступными при переводе iPhone в режим «Авиакомпания». Основной алгоритм:

1) обнаружить NavigationType LinkClicked и в этом случае загрузить запрашиваемую страницу из автономного кэша;

2) когда автономный кэш завершает загрузку запрошенного URL-адреса, запускается уведомление offlineRequestSuccess ;

3) мое веб-представление обрабатывает это уведомление и загружает строку ответа в веб-представление.

Вот мой код для этого:

public class UIMobileformsWebView : UIWebView
{        
    private UIMobileformsWebView () : base()
    {
        UIWebView self = this;
        this.ShouldStartLoad = (webview, request, navigationType) => {                
            if (navigationType == UIWebViewNavigationType.LinkClicked) {
                OfflineRequest.GetInstance().FetchUrl(request.URL);
                return false;
            }
            return true;
        };
        NSNotificationCenter.DefaultCenter.AddObserver(new NSString("offlineRequestSuccess"), new Action<NSNotification>(OfflineRequestSuccess));
    }

    void OfflineRequestSuccess (NSNotification notification)
    {
        ASIHTTPRequest theRequest = (ASIHTTPRequest)notification.Object;
        String response = System.IO.File.ReadAllText(theRequest.DownloadDestinationPath);
        this.LoadHtmlString(response, theRequest.URL);
    }
}

Для тех, кто знает только цель C, вы можете увидеть механизм того же типа, объясненный в ответе на этот вопрос:

Вопрос об UIWebview при нажатии на ссылки

Этот основной алгоритм хорошо работает для большинства моих веб-страниц, но имеет проблему с запросами, сделанными из javascript, а не из-за нажатия на ссылку. Если мой javascript имеет значение window.location.href = URL , то тип навигации, который я вижу в событии ShouldStartLoad , имеет тип Другое , а не LinkClicked . Из-за этого эти запросы не отправляются в мой автономный кеш. Запросы, поступающие из LoadHtmlString, также имеют тип навигации Другой , поэтому в зависимости от типа навигации я не могу отличить запросы от запросов LoadHtmlString и javascript на моей странице.

В общем, мне нужно изменить эту строку кода:

if (navigationType == UIWebViewNavigationType.LinkClicked) {

к чему-то, что лучше, отличает запросы от моих веб-страниц и от LoadHtmlString в OfflineRequestSuccess . Кто-нибудь получил какие-либо идеи, как я мог лучше сделать это различие?

1 Ответ

1 голос
/ 20 августа 2011

Вы можете легко их различить, если для логического свойства делегата установлено значение true, когда вы используете LoadHtmlString, и сбрасываете его по окончании. Веб-представление не знает об этом свойстве и не установит для него значение true. Если это свойство YES, оно должно быть из-за запроса LoadHtmlString.

...