Question intéressante.
Il y a deux parties à faire ce travail: un JavaScript gestionnaire et UIWebView délégué méthodes. En JavaScript, nous pouvons modifier le prototype des méthodes pour déclencher des événements lorsqu'une requête AJAX est créé. Avec notre UIWebView délégué, nous pouvons saisir ces événements.
JavaScript Gestionnaire
Nous avons besoin d'être averti lorsqu'une requête AJAX est faite. J'ai trouvé la solution ici.
Dans notre cas, pour rendre le code du travail, j'ai mis le code JavaScript suivant dans une ressource appelée ajax_handler.js ce qui est fournie avec mon application.
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();
}
Ce que cela va réellement faire est de changer l'emplacement du navigateur pour certains composée schéma d'URL (dans ce cas, mpAjaxHandle) avec des informations sur la demande. Ne vous inquiétez pas, notre délégué à l'intercepter et l'emplacement ne change pas.
UIWebView Délégué
Tout d'abord, nous avons besoin de lire notre fichier JavaScript. Je suggère de faire le stocker dans une variable statique. Je suis dans l'habitude de l'utiliser +initialiser.
static NSString *JSHandler;
+ (void)initialize {
JSHandler = [[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"ajax_handler" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil] retain];
}
Ensuite, nous voulons injecter ce JavaScript avant qu'une page est fait, le chargement afin que nous puissions recevoir tous les événements.
- (void)webViewDidStartLoad:(UIWebView *)webView {
[webView stringByEvaluatingJavaScriptFromString:JSHandler];
}
Enfin, nous voulons capturer l'événement.
Depuis le Schéma d'URL est composée, nous n'avons pas vraiment envie de le suivre. Nous revenons PAS et tout est bien.
#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;
}
J'ai créé un exemple de projet avec la solution, mais n'ont pas d'endroit pour l'accueillir. Vous pouvez moi un message si vous pouvez l'héberger et je vais éditer ce post en conséquence.