¿Cómo get / manejar la respuesta de ajax desde el paso de formulario final en UIWebView?

Tengo una aplicación híbrida que utiliza un UIWebView para cargar un formulario ajax / multi-step desde un server. Cada paso envía una request de ajax al server y recibe una respuesta adecuada del server en function de los pasos anteriores. En el último paso, me gustaría poder procesar la respuesta y usar esa información en mi aplicación para varias cosas. Usando Swift, ¿cuál es la mejor manera de lograrlo? Obviamente, puedo get la respuesta inicial cuando la página se carga utilizando NSURLCache, pero parece que no puedo entender cómo tomar las respuestas que se reciben entre pasos ajax. ¿Algunas ideas?

Como puede inyectar su propio Javascript en una página web de UIWebView, puede introducir una capa de ajuste para las llamadas de Ajax una vez que se haya cargado la página inicial.

En esta solución, carga una URL compuesta que puede detectar en su delegado UIWebView en function de la llamada Ajax. Cuando el delegado ve la URL falsa, graba la llamada de Ajax, pero devuelve que la carga no debería suceder. Entonces, la calza llama al código Ajax original, así que todo funciona.

Entonces, aunque no puede detectar llamadas de Ajax, puede detectar requestes de URL.

La siguiente respuesta parece tener todo lo que necesita: UIWebViewDelegate no monitorea XMLHttpRequest?

** Actualización **

Tomé el código del enlace de arriba y lo extendí para detectar también las respuestas. Este código actualizado solicita una carga de una URL falsa que contiene el estado readyState y http después del '//'. Lo hace en cada cambio de estado listo.

Entonces, cuando se realiza una request de Ajax, verá las siguientes requestes en su delegado de UIWebView:

1) Una request para cargar una URL del formulario mpAjaxHandler: // URL

2) En cada cambio de estado siguiendo Ajax send (), una request para cargar una URL del formulario mpAjaxHandlerDone: // readyState: httpstatus / URL

Supongo que está buscando cuando el readyState llegue a 4 con el estado HTTP de 200 para el éxito.

Para activar esto, cargue el javascript a continuación cuando su página principal haya terminado de cargarse en UIWebView y vea si su delegado dispara por request y respuesta.

 var s_ajaxListener = new Object(); s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open; s_ajaxListener.tempSend = XMLHttpRequest.prototype.send; s_ajaxListener.callback = function () { console.log('mpAjaxHandler://' + this.url); window.location='mpAjaxHandler://' + this.url; }; s_ajaxListener.callbackDone = function (state,status) { console.log('mpAjaxHandlerDone://' + state + ':' + status + '/' + this.url); window.location='mpAjaxHandlerDone://' + state + ':' + status + '/' + this.url; }; // Added this function to catch the readyState changes and request // fake page loads. function override_onreadystatechange(){ s_ajaxListener.callbackDone(this.readyState); this.original_onreadystatechange(); } 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(); // Added this to intercept Ajax responses for a given send(). this.original_onreadystatechange = this.onreadystatechange; this.onreadystatechange = override_onreadystatechange; } 

He intentado esto en un browser pegando el código en la parte superior del método loadDoc () en esta demostración de W3Schools y buscando en la console de javascript. http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_first . Si testing este comentario, las dos window.location= líneas primero.

Espero que esto te ayude o te dé un comienzo.