Я встроил автономную функциональность в свой 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 . Кто-нибудь получил какие-либо идеи, как я мог лучше сделать это различие?