2011-01-14 10 views
7

Estoy construyendo una aplicación para iPhone que muestra un UIWebView apuntando a una aplicación web que he creado.La interacción del usuario a veces arruina las solicitudes jQuery ajax en UIWebView

La aplicación web realiza frecuentes llamadas al servicio web para los elementos de datos que se utilizan para animar los controles en un lienzo. Las llamadas para el uso de datos jQuery ajax, pasan parámetros a través de JSON y reciben una respuesta XML.

Estoy descubriendo que, aunque se están produciendo interacciones del usuario con UIWebView, el método javascript setTimeout está bloqueado y no parece ejecutarse en absoluto. Lo suficientemente justo; hay formas de evitar esto

Pero el principal problema es que de vez en cuando, después de las interacciones del usuario (acercamiento, panoramización, etc.), las llamadas al servicio web ajax simplemente fallan todo el tiempo y no puedo establecer una razón. Incluso si se hacen repetidamente, durante los próximos minutos ninguno de ellos llegará al servicio web. Si deja completamente el UIWebView solo, nunca fallarán mientras el servicio web esté funcionando y la conectividad esté presente.

¿Alguien puede sugerir por qué, y cómo solucionarlo o solucionarlo?

Actualización rápida: de acuerdo con el depurador móvil Safari, el objeto 'respuesta' en la función de error no está definido. (Funciona si, por ejemplo, invalido el URL. Esto se puede llamar desde Object-C por [webView stringByEvaluatingJavascript: @ "lastError"], pero arroja una excepción para este error 'tocado el uiwebview'):

$.ajax({ 
    type: "POST", 
    url: "WebService.asmx/GetValues", 
    async: true, 
    data: "{'pageVersionIndex': " + PageVersionIndex + " , 'timeStreamIndex': '" + TimeStream + "'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "xml", 
    success: function (response) { UpdateControls(response); }, 
    error: function (response, status, errorthrown) { 
     calling = false; 
     lastError = response.statusText; //Throws exception 
     connectionInterrupted = true; 
     DataRoutine = window.setTimeout(DataService, dataFrequency); } 
    }); 
+1

Creo que sería una buena idea para sustituir una etiqueta iPhone relevante para una de las etiquetas que tienes ("aplicaciones web" tal vez). – Pointy

+0

Buena idea, será suficiente. –

Respuesta

2

Me temo que estás tostado ... en cierto modo. En iOS Safari y en UIWebView, respectivamente, los procesos del sistema tienen prioridad sobre el navegador y si hay una demanda repentina de más CPU o memoria para procesos nativos (como tocar el teclado, etc.) puede ocurrir que se detenga la ejecución de javascript para reducir el carga de memoria o uso de la CPU. La peor parte es que no arrojará ningún error ni nada ... simplemente detiene la ejecución del código como si nada hubiera sucedido.

Miedo a que si ocurre mucho en su aplicación, la única manera sería agregar algún tipo de temporizador que escuche si la solicitud no fue bloqueada, de ser así, hágalo nuevamente hasta que sea exitoso.

altibajos de IOS - que realmente les gusta que se vaya nativa en lugar de web :)

creo que sirve, Tom

+0

Gracias por el consejo. He agotado todas las vías y la única forma en que he podido superar el problema es realizando llamadas manualmente al servicio web utilizando un NSURLConnection en lugar de llamar a los métodos de JavaScript en la página. También le da un mejor control sobre el tiempo de espera, reintentos, etc. –

Cuestiones relacionadas