我已將離線功能構建到我的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進來。任何人有任何想法,我怎麼可以作出這種區別?