2012-05-29 22 views
9

Para resumir: tuve que crear una funcionalidad de chat que parece funcionar en todos los dispositivos excepto en el iPad (y posiblemente en el iPhone). Nuestro cliente usa sus iPads para chatear, así que he tratado de resolver los problemas durante los últimos 7 meses.iPad ajax problems

Ese es el tiempo que tardé en señalar un tanto el problema.

El problema está claramente en el navegador del iPad. Ejecuto las solicitudes JSON Ajax usando la biblioteca jQuery. Las solicitudes están bien, no contienen errores. En algún momento, el iPad simplemente no ejecuta solicitudes de Ajax en absoluto. No sé por qué, no puedo encontrar por qué. Cada solicitud de Ajax se registra, pero en algún momento el servidor no recibe ninguna solicitud. Lo he pedido un billón de veces y el cliente está seguro de que solo están tocando el ipad para evitar que se bloquee.

He reducido la tasa de solicitudes a aproximadamente 15 solicitudes por minuto, pero eso no funcionó.

Entonces, mi pregunta es: ¿Hay alguna información conocida por el hombre por qué el iPad deja de enviar abruptamente solicitudes Ajax después de 10-15 minutos?

+0

¿Funciona en Safari en una computadora? – adarshr

+0

¿Estás haciendo solicitudes asíncronas? ¿Estás estableciendo caché = falso? – FlavorScape

+0

@adarshr sí, lo hacemos –

Respuesta

7

Poniendo esto aquí, como en el comentario no hay ningún resaltado de sintaxis.

He hecho una página súper mínima prueba aquí: http://www.focalstrategy.com/tests/ajax.php

El código es:

<? 

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 

echo date("F j, Y, G:i:s a"); 
exit(); 

} 

?> 
<!doctype html> 
<html> 
<head> 
    <title>AJAX test</title> 
</head> 
<body> 
    <h1>Ajax Test</h1> 
    <p>This page makes an AJAX request every 5 seconds and replaces the div below with the returned date.</p> 

    <div><p id="date"><?= date("F j, Y, G:i:s a") ?></p></div> 
    <div><p><span id="count">0</span> updates made.</p></div> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
    <script> 
    var count = 0; 

    var getDate = function() { 
     $.get('/tests/ajax.php', function(data) { 
      $('#date').html(data); 
      count = count + 1; 
      $('#count').html(count); 
     }); 
    } 
    setInterval(getDate, 5000); 
    </script> 

</body> 
</html> 

Por lo tanto, me encontré con esto durante una hora, y no tenía ningún problema, el IPAD (completamente actualizado) funcionó bien a lo largo, sin perder ninguno.

También ejecuté esto en Chrome y grabé su comportamiento. Esto se parece a esto:

Chrome Profiler view, showing graphs for DOM Node, Event Listeners and memory usage.

(Full size)

Hay algo de rareza aquí, en la que en un principio el número de detectores de eventos permanece constante, entonces después de un tiempo se vuelve loco ,, aumentando hasta 56 oyentes antes de caer a 1 de nuevo. El recuento de nodos DOM también aumenta de forma repetida, tan alto como 424. Ambos tienen un comportamiento bastante extraño teniendo en cuenta la simplicidad de este código.

Quizás en su aplicación el número de nodos Dom sea rastreado, o el número de oyentes de eventos esté alcanzando algún valor, haciendo que el iPad pierda la noción de lo que está sucediendo, o algo similar.

También vale la pena observar que el uso de la memoria aumenta hasta que se produce la recolección de basura. Eso es lo que debe suceder, aunque quizás sea menos eficiente en el iPad.

Editar: He probado nuevamente en un perfil limpio, muchos de los oyentes de eventos se deben a extensiones - el mismo comportamiento ocurre, pero no en la misma medida, también los valores de fondo son 0-1 en lugar de 15-20

+0

Estoy ejecutando los diagnósticos por un tiempo también, con algo de interacción (para ver si la interacción provoca fugas de memoria o algo) aunque la memoria parece estar bien. El único pico está en los primeros 2.5 minutos (12mb) pero después de eso permanece por debajo de 5mb así que dudo mucho que ese sea el problema. Gracias por el esfuerzo sin embargo. –

+0

Es algo realmente extraño. Esperaba ver una acumulación catastrófica de algo que causara que el iPad se rindiera ... Quizás sus iPads pierden conexión Wifi brevemente, haciendo que se detengan las solicitudes. No sé si el iPad continuará preguntando después de eso. Para evitar esto, podría ejecutar el código en un iframe, luego cada 10 minutos actualizar el iFrame o algo así. –

+0

He estado buscando para ver si hay algo intrínsecamente incorrecto con este enfoque, pero no puedo ver mucho. Obviamente, mirar largas encuestas, cometas o algo probablemente no valga la pena aquí, pero es algo en lo que pensar. –