如何区分请求来自LoadHtmlString和网页请求在事件ShouldStartLoad



我已经在我的UIWebView中构建了离线功能,这样当iPhone进入航空模式时,已经加载的页面仍然可用。基本算法为:

1)检测NavigationType LinkClicked,在这种情况下,从离线缓存加载请求的页面;

2)当离线缓存完成加载请求的URL,然后触发offlineRequestSuccess通知;

3)我的webview处理这个通知,并加载响应字符串到webview。

下面是我的代码:

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);
    }
}

对于那些只知道Objective C的人,你可以在这个问题的答案中看到相同类型的机制解释:

关于点击链接时UIWebview的问题

这个基本算法对我的大多数网页都很有效,但有一个问题,来自javascript而不是点击链接的请求。如果我的javascript window.location。href = URL那么我在ShouldStartLoad事件中看到的导航类型是类型Other,而不是LinkClicked。因此,这些请求不会被发送到我的离线缓存。来自LoadHtmlString的请求也有导航类型Other,因此基于导航类型,我无法区分页面中的LoadHtmlString请求和javascript请求。

基本上,我需要改变这行代码:

if (navigationType == UIWebViewNavigationType.LinkClicked) {

的东西,更好地区分请求来自我的网页和请求来自LoadHtmlStringOfflineRequestSuccess。有人知道如何更好地区分这个吗?

如果您在使用LoadHtmlString时将委托的布尔属性设置为true并在完成时重置它,则可以轻松区分这些。web视图不知道这个属性,它不会把它设为true。如果属性是YES,那一定是因为LoadHtmlString请求。

最新更新