Desencadenar webViewDidFinishLoad para los resultados de búsqueda de Google

Estoy intentando ejecutar el código cuando una página está terminada de cargar en mi webViewDidFinishLoad . Sin embargo, si visito google.com en mi UIWebView luego UIWebView una búsqueda, la primera consulta funciona, pero todas las búsquedas adicionales no activarán el webViewDidFinishLoad . De acuerdo con otros artículos, esto se debe a google usando las requestes ajax. Para combatir esto, inyecte JavaScript en las páginas para activar un método iOS una vez que se haya cargado. Sin embargo, no parece funcionar correctamente para google, pero funciona para otros sitios de Ajax como Yahoo.

¿Estoy haciendo el javascript correctamente? ¿Alguien tiene una sugerencia sobre cómo get el javascript para llamar al método Obj-C después de que se haya cargado el ajax?

ajax_handler.js (incluido con la aplicación)

 var s_ajaxListener = new Object(); var originalReadyStateChange; s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open; s_ajaxListener.tempSend = XMLHttpRequest.prototype.send; s_ajaxListener.callback = function () { console.log(this); if (this.readyState == 4) { console.log("TRIGGERING HANDLER"); window.location='x3AjaxHandler://' + this.url; console.log(originalReadyStateChange); } else { console.log("READY STATE NOT FINISHED"); } originalReadyStateChange(); }; 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; console.log(this); originalReadyStateChange = this.onreadystatechange; this.onreadystatechange = s_ajaxListener.callback; } 

WebView

 #define CocoaJSHandler @"x3AjaxHandler" static NSString *ajaxInjectionHandler; +(void)initialize { ajaxInjectionHandler = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"ajax_handler" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil]; NSLog(@"js: %@", ajaxInjectionHandler); } -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSLog(@"SHOULD LOAD"); if ([[[request URL] scheme] caseInsensitiveCompare:CocoaJSHandler] == NSOrdenetworkingSame) { NSString *requestedURLString = [[[request URL] absoluteString] substringFromIndex:[CocoaJSHandler length] + 3]; NSLog(@"ajax request: %@", requestedURLString); [self webViewDidFinishLoad:webView]; return NO; } return YES; } - (void)webViewDidStartLoad:(UIWebView *)webView { NSLog(@"INJECTING"); [webView stringByEvaluatingJavaScriptFromString:ajaxInjectionHandler]; } 

Podría intentar crear y eliminar un iFrame con el esquema de url y la ruta como atributo src . Configuración window.location no funcionó para mí. Esto me funcionó hasta ahora:

 function sendRequestToiOS(url) { // Create and append an iFrame to the document and set it with the url schema var iframe = document.createElement("IFRAME"); iframe.setAttribute("src", "x3AjaxHandler://" + url); // For some reason we need to set a non-empty size for the iOS6 simulator... iframe.setAttribute("height", "1px"); iframe.setAttribute("width", "1px"); document.documentElement.appendChild(iframe); iframe.parentNode.removeChild(iframe); iframe = null; }