我已经在我的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) {
的东西,更好地区分请求来自我的网页和请求来自LoadHtmlString在OfflineRequestSuccess。有人知道如何更好地区分这个吗?
如果您在使用LoadHtmlString时将委托的布尔属性设置为true并在完成时重置它,则可以轻松区分这些。web视图不知道这个属性,它不会把它设为true。如果属性是YES,那一定是因为LoadHtmlString请求。