Интересный вопрос.
Эта работа состоит из двух частей: обработчик JavaScript и методы делегата UIWebView.В JavaScript мы можем модифицировать методы-прототипы для запуска событий при создании запроса AJAX.С нашим делегатом UIWebView мы можем захватить эти события.
Обработчик JavaScript
Мы должны быть уведомлены, когда сделан запрос AJAX.Я нашел решение здесь .
В нашем случае, чтобы заставить код работать, я поместил следующий JavaScript в ресурс под названием ajax_handler.js , который связан смое приложение.
var s_ajaxListener = new Object();
s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;
s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;
s_ajaxListener.callback = function () {
window.location='mpAjaxHandler://' + this.url;
};
XMLHttpRequest.prototype.open = function(a,b) {
if (!a) var a='';
if (!b) var b='';
s_ajaxListener.tempOpen.apply(this, arguments);
s_ajaxListener.method = a;
s_ajaxListener.url = b;
if (a.toLowerCase() == 'get') {
s_ajaxListener.data = b.split('?');
s_ajaxListener.data = s_ajaxListener.data[1];
}
}
XMLHttpRequest.prototype.send = function(a,b) {
if (!a) var a='';
if (!b) var b='';
s_ajaxListener.tempSend.apply(this, arguments);
if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a;
s_ajaxListener.callback();
}
На самом деле это изменит местоположение браузера на какую-то составленную схему URL (в данном случае mpAjaxHandle ) с информацией о выполненном запросе.Не беспокойтесь, наш делегат поймает это, и его местоположение не изменится.
UIWebView Delegate
Сначала нам нужно прочитать наш файл JavaScript.Я предлагаю хранить его в статической переменной.У меня есть привычка использовать + initialize.
static NSString *JSHandler;
+ (void)initialize {
JSHandler = [[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"ajax_handler" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil] retain];
}
Далее, мы хотим внедрить этот JavaScript, прежде чем загрузка страницы завершится, чтобы мы могли получать все события.
- (void)webViewDidStartLoad:(UIWebView *)webView {
[webView stringByEvaluatingJavaScriptFromString:JSHandler];
}
Наконец, мы хотим запечатлеть это событие.
Поскольку схема URL составлена, мы не хотим фактически следовать ей.Мы возвращаем NO и все хорошо.
#define CocoaJSHandler @"mpAjaxHandler"
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if ([[[request URL] scheme] isEqual:CocoaJSHandler]) {
NSString *requestedURLString = [[[request URL] absoluteString] substringFromIndex:[CocoaJSHandler length] + 3];
NSLog(@"ajax request: %@", requestedURLString);
return NO;
}
return YES;
}
Я создал пример проекта с решением, но некуда его разместить.Вы можете написать мне, если сможете разместить его, и я соответствующим образом отредактирую этот пост.