我已将离线功能构建到我的UIWebView中,以便在iPhone进入航空公司模式时,已加载的页面仍可用。基本算法是:如何在事件ShouldStartLoad中区分来自网页请求的来自LoadHtmlString的请求?
1)detect 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);
}
}
对于那些只知道目标C,你可以看到同样类型的机构在这个问题的答案解释:
Question about UIWebview when tapping links
这个基本算法适用于我的大多数网页,但是在使用javascript而不是点击链接的问题上存在问题。如果我的JavaScript并window.location.href =网址然后导航型,我在ShouldStartLoad事件看到的是键入其他,不LinkClicked。因此,这些请求不会发送到我的脱机缓存。来自LoadHtmlString的请求也具有导航类型其他,因此基于导航类型,我无法区分LoadHtmlString和JavaScript页面中的请求。
所以基本上,我需要改变这行代码:
if (navigationType == UIWebViewNavigationType.LinkClicked) {
的东西,尤为明显区分请求从我的网页来了,并且请求从LoadHtmlString OfflineRequestSuccess进来。任何人有任何想法,我怎么可以作出这种区别?